MFC模态与非模态对话框的创建与销毁

1、模态对话框的创建

(1)添加新的模块对话框资源,在ResourceView标签中右键项目选择“add resource...”,添加一个对话框资源,并修改其ID(主要为了方便后续操作),例如修改为IDD_DLG_TEST1

(2)为该新添加的窗口创建新类CDlgTest1

(3)创建模态对话框:

* 定义一个CDlgTest1类的指针m_pDlgTest1.

* 为类m_pDlgTest1添加一个父窗口句柄的成员变量m_hMainWnd,主要用于向父窗口发送消息,此功能可根据需要进行取舍。

* 添加创建模块对话框:

if (NULL == m_pDlgQuiverTest)

{

m_pDlgTest1= new CDlgTest1();

m_pDlgTest1->SetMainWnd(this->m_hWnd);

m_pDlgTest1->DoModal();

}

else

m_pDlgTest1->SetForegroundWindow();

说明:

* 如果指针m_pDlgTest1非空,则只需将窗口置顶无需也不能新创建。

* 向模态对话框中添加父窗口的句柄,主要用于模态对话框向其父窗口发送消息用,此功能可以根据自己需要进行取舍

 

 

2、模态对话框的销毁

(1)在退出时向父窗口发送窗口退出消息:

::PostMessage(m_hMainWnd,WM_DESTROY_GET_QUIVER_STANDERED,0,0);

(2)为父窗口添加消息WM_DESTROY_DLGTEST1和其相应函数,

声明函数:afx_msg LRESULT _OnDestroyDlgTest1(WPARAM wParam,LPARAM lParam);

消息响应宏:ON_MESSAGE(WM_DESTROY_DLGTEST1,_OnDestroyDlgTest1)

(3)在消息响应函数_OnDestroyDlgTest1中销毁创建的模态窗口:

LRESULT CParentDlg::_OnDestroyDlgTest1(WPARAM wParam,LPARAM lParam)

{

if (NULL != m_pDlgTest1)

{

delete m_pDlgTest1;

m_pDlgTest1= NULL;

}

return  0;

}

 

3、非模态对话框的创建

非模态对话的创建与模态对话框类似,区别之处在于需要调用Create函数创建窗口,并调用showwindow而不是domodal函数显示窗口

具体如下,区别之处已用红色标出:

if (NULL == m_pDlgGetQS)

{

m_pDlgGetQS = new CGetQuiverStandered();

m_pDlgGetQS->Create(IDD_DLG_GET_QUIVER_STANDERED,this);

m_pDlgGetQS->SetMainWnd(this->m_hWnd);

m_pDlgGetQS->ShowWindow(SW_SHOW);

}

else

m_pDlgGetQS->SetForegroundWindow();

 

4、非模态对话框的销毁

非模态对话框的销毁与模态对话框的销毁一样,起始销毁的过程可以按照上述模态对话的销毁方法,也可以根据自己的需要进行其他方式的销毁,但是一定要在销毁之后将指针m_pDlgTest1值为空,否则下次便无法创建

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