所有的對話框類都基于CDialog基類,CDialog類又繼承于CWnd類。對話框分為模态對話框和非模态對話框
(一)建立模态對話框:
void CMyboleView::OnDialog()
{
// TODO: Add your command handler code here
CTestDlg dlg;
dlg.DoModal();
}
CDialog::DoModal()建立、顯示模态對話框并停止程式直到模态對話框被關閉,細心的同學會發現,你定義的對話框類的對象是個局部變量,當OnDialog函數一旦執行完畢那麼對象dlg的生命周期就結束了,與該對象相關聯的對話框就會被銷毀了,也就是說你建立的對話框會一閃而逝或者不顯示了,事實會是這樣嗎?不會,因為當執行到DoModal函數時,程式會在該條語句處停止,這也是DoModal函數的一個功能,直到模态對話框關閉(用EndDialog函數來關閉一個模态對話框),也就是說dlg的生命周期的結束是在模态對話框結束關閉的時候。
CDialog::EndDialog()關閉一個模态對話框,該函數的傳回值作為DoModal的傳回值,它隻是隐藏了模态對話框,并沒有将之銷毀。
(二)建立非模态對話框:
void CMyboleView::OnDialog()
{
// TODO: Add your command handler code here
CTestDlg dlg;
dlg.DoModal();
}
CDialog::Create()建立一個非模态對話框并将該非模态對話框資源與dlg對象相關聯,該函數的功能比較弱,在調用該函數建立一個非模态對話框還需要調用dlg.ShowWindow(SW_SHOW)函數來顯示。因為該函數沒有DoModal的停止功能,是以dlg對象不能是局部變量,也就是說dlg的生命周期不能随着OnDialog函數的結束而結束,解決辦法有二,第一種是将dlg設定成全局變量,第二種是定義一個指針子,再堆上配置設定記憶體,用new來配置設定一個堆空間(堆空間裡的變量的生命周期與整個程式的生命周期是一緻的),代碼如下:
voidCMyboleView::OnDialog()
{
// TODO: Add your command handler codehere
/*CTestDlg dlg;
dlg.DoModal();
CTestDlg dlg;
dlg.Create(IDD_DIALOG1,this);
dlg.ShowWindow(SW_SHOW);*/
CTestDlg *pDlg=new CTestDlg();
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);
}
不過一旦該函數結束後,建立的非模态對話框就不能被引用了。因為OnDialog函數結束後pDlg的生命周期結束了,就不能通過指針pDlg儲存的位址來找到原先配置設定的記憶體了,需要在析構函數中delete這塊記憶體。
CWnd::ShowWindow()用來設定一個窗體的顯示狀态,因為對話框類繼承于CWnd,是以對話框也是一個視窗。
(三)小結:
OnOk和OnCancel函數是CDialog類的虛函數。
對于模态對話框上的Ok按鈕和cancel按鈕被點選時,如果OnOk和OnCancel函數沒有被覆寫,那麼就會調用CDialog類的OnOk和OnCancel函數,此時模态對話框會被destroy掉。
對于非模态對話框上的Ok按鈕和Cancel按鈕被點選時,如果OnOk和OnCancel函數也沒有被覆寫,那麼程式調用的也是CDialog類的OnOk和OnCancel函數,但這兩個函數僅僅使非模态對話框不可見,是以當在一個非模态對話框上實作Ok按鈕時必須重寫OnOk函數,并且在重寫的OnOk函數裡調用DestroyWindow函數,不要調用基類的EndDialog函數。