vc++開發學習二(模態對話框和非模態對話框的創建和銷燬)

①、模態對話框與非模態對話框的區別:

      模態對話框:一旦創建模態對話框,則無法操作父對話框,只能操作當前創建的模態對話框,關閉當前模態對話框後纔可以操作父對話框非模態對話框:和模態對話框相反,創建該對話框後可以繼續操作父對話框

②、新對話框資源的添加及相關類的綁定:

      首先是先創建一個對話框模板資源,在資源文件裏鼠標放到工程名上左擊然後選擇添加,在選中資源,最後選擇Dialog確定即可,然後在新生成的對話裏,修改名字或者id,最後爲窗口關聯一個類,即選擇新創建的窗口,右擊添加類,選擇基類爲CDialog,添加類名即可關聯,如果接下來就是在主窗口裏創建模態或者非模態對話框即可,如下操作

③、模態對話框的創建:CDialog::DoModal

//模態對話框的創建
void CMFCtestDlg::OnCreateDialog()
{
//創建好模態對話框以後,程序就會阻塞在這裏,後面的程序無法執行
//直到模態對話框被關閉
CMydialog dlg;
dlg.DoModal();
MessageBox(_T("關閉模態對話框後顯示該窗口"));
}

 

④、非模態對話框的創建:CDialog::Create

    //這樣創建會出現問題,對話框一閃而過
	void CMFCtestDlg::OnCreateNoDlg()
	{
		CMydialog dlg;//在這裏定義的局部變量容易被釋放,因此需要全局定義
		dlg.Create(IDD_My_DIALOG,this);
		dlg.ShowWindow(SW_SHOW);
		//MessageBox(_T("非模態對話框顯示同時顯示該窗口"));
	}

 在創建非模態對話框時儘量不要申請局部變量,因爲局部變量一旦執行完就會被釋放,創建的非模態對話框也會被消除,通常申請變量   在堆中申請內存:new、malloc 。  靜態存儲區域:全局變量

使用全局變量進行解決:

使用全局變量進行解決:
//非模態對話框創建
//把窗口定義爲全局變量,避免被釋放
CMydialog dlg;
void CMFCtestDlg::OnCreateNoDlg()
{
	//CMydialog dlg;//在這裏定義的局部變量容易被釋放,因此需要全局定義
	dlg.Create(IDD_My_DIALOG,this);
	dlg.ShowWindow(SW_SHOW);
	//MessageBox(_T("非模態對話框顯示同時顯示該窗口"));
}

但是這種創建點擊取消後第二次打開出現錯誤,其原因是非模態對話框需要我們自己釋放資源,在CMydialog窗口類中添加取消的函數。以及添加確定的函數進行釋放,如下,一般都是進行類嚮導或者點資源裏面選擇這個類並對其函數進行重載

具體如下:

void CMydialog::OnCancel()
{
	DestroyWindow();
	//CDialog::OnCancel();
}
void CMydialog::OnBnClickedOk()
{
	// TODO: 在此添加控件通知處理程序代碼
	DestroyWindow();
	//CDialog::OnOK();
}
這樣就解決了二次創建出錯的問題

使用new進行申請:

// CMFCtestDlg 對話框
class CMFCtestDlg : public CDialogEx
{
// 構造
public:
	CMFCtestDlg(CWnd* pParent = nullptr);	// 標準構造函數
	CMydialog* pDlg;
}

//非模態對話框創建
void CMFCtestDlg::OnCreateNoDlg()
{
	//CMydialog dlg;//在這裏定義的局部變量容易被釋放,因此需要全局定義
	pDlg = new CMydialog();
	pDlg->Create(IDD_My_DIALOG,this);
	pDlg->ShowWindow(SW_SHOW);
	//MessageBox(_T("非模態對話框顯示同時顯示該窗口"));
}

同樣的問題,第二次打開出現錯誤,因爲是沒有釋放,這時候還是需要重載類的函數,具體操作是在類嚮導,打開選擇這個CMydialog類,然後選擇重載函數,找到這個PostNcDestroy,然後添加如下代碼即可。

void CMydialog::PostNcDestroy()
{
	// TODO: 在此添加專用代碼和/或調用基類
	delete this;
	CDialog::PostNcDestroy();
}

最後就是如果我們需要在模態或者非模態對話框進行初始化操作,這時你會發現對應的.cpp文件是沒有BOOL CMydialog::OnInitDialog(),如何調出來呢?很簡單,還是使用類嚮導進行重載即可,找到OnInitDialog()進程重載即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章