對話框彈出瞬間自動執行邏輯(如初始化數據、啟動線程、播放動畫),無需用戶點擊按鈕。
| 位置 | 典型用途 | 注意事項 |
|---|---|---|
CWinApp::InitInstance() | 應用級初始化、創建主對話框、註冊類工廠 | 返回 FALSE 會終止應用;此時對話框尚未 DoModal |
對話框構造函數 CMyDlg::CMyDlg() | 成員變量初始化、分配堆內存、綁定事件 | 視窗句柄尚未創建,不可調用 GetDlgItem/SetWindowText 等 UI 操作 |
BOOL CMyDlg::OnInitDialog() | 最推薦:UI 初始化、設置圖標、加載數據、啟動定時器、顯示子視圖 | 視窗已創建、控件可用;必須調用 CDialogEx::OnInitDialog() 並返回 TRUE |
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 必須調用基類
// 1. 設置圖標
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// 2. 初始化控件
m_listCtrl.InsertColumn(0, _T("名稱"), LVCFMT_LEFT, 150);
m_comboBox.AddString(_T("選項一"));
// 3. 啟動異步任務
AfxBeginThread(WorkerThread, this);
// 4. 設置定時器
SetTimer(1, 1000, NULL);
return TRUE; // 除非設置焦點到控件,否則返回 TRUE
}
DoModal() 內部會調用 OnInitDialog,邏輯同上。Create(IDD_MYDLG) 後立即調用 ShowWindow(SW_SHOW),OnInitDialog 在 Create 過程中被觸發。OnSetActive / OnInitDialog。GetDlgItem(IDC_EDIT)->SetWindowText(...) → 返回 NULL 導致崩潰。OnInitDialog → 系統初始化缺失(如縮放、佈局)。對話框自動執行邏輯,**首選 OnInitDialog**,構造函數僅做非 UI 初始化,InitInstance 屬於應用層面。牢記「視窗句柄就緒」是 UI 操作的前提。