- 模态对话框
在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念
模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入
非模态对话框:各窗口之间不影响
主要区别:非模态对话框与APP共用消息循环,不会独占用户。
模态对话框独占用户输入,其他界面无法响应
在用户层的主要逻辑如下:
TestDlg dlg;
if (dlg.DoModal() == IDOK)
{
//处理完毕后的操作
}
.......//后续处理
在具体实现中,有如下几个步骤:
1. 让父窗口失效 EnableWindow(parentWindow, FALSE)
2. 建立模态对话框自己的消息循环(RunModalLoop)
3. 直至接收关闭消息,消息循环终止,并销毁窗口。
INT_PTR CDialog::DoModal()
{
//对话框资源加载
......
//在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息
HWND hWndParent = PreModal();
AfxUnhookWindowCreate();
BOOL bEnableParent = FALSE;
if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
.......
}
//创建模态窗口,并进行消息循环,若窗口不关闭,则循环不退出
AfxHookWindowCreate(this);
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
//窗口关闭,销毁窗口
DestroyWindow();
PostModal();
<