实现模态消息循环
总结 短语模态窗口用于描述在应用程序框架窗口上弹出的消息或对话框。 当模式窗口出现时,应用程序窗口不能使用。 系统提供了如下功能来创建模态窗口:MessageBox, DialogBox, DialogBoxParam, DialogBoxIndirect和DialogBoxParamIndirect。 更多的信息 模态窗口的实现有两个方面。 首先,必须禁用父窗口,以防止用户交互。 第二,模态消息循环——模态窗口是用它自己的消息循环实现的。 一个典型的实现可能是这样的: 隐藏,收缩,复制Code
BOOL fDone;
INT nResult;
int RunModalWindow(
HWND hwndDialog,
HWND hwndParent)
{
if(hwndParent != NULL)
EnableWindow(hwndParent,FALSE);
MSG msg;
for(fDone=FALSE;fDone;WaitMessage())
{
while(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
{
fDone = TRUE;
PostMessage(NULL,WM_QUIT,0,0);
break;
}
if(!IsDialogMessage(hwndDlg,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
if(hwndParent != NULL)
EnableWindow(hwndParent,TRUE);
DestroyWindow(hwndDialog);
return nResult;
}
注意一些重要的特点的循环: 不能通过调用PostQuitMessage来终止模态消息循环,因为该函数用于终止UI线程。 线程拥有的所有窗口必须被销毁。 因此,如果WM_QUIT被拾取,它必须手动重新发布。 通过调用一个特殊的函数来设置与窗口相关联的标志,可以正确地关闭模态窗口。 在示例代码中,终止标志是fDone,通常存储在WindowLong中。 通常,模态窗口也允许返回代码——示例代码使用了nResult来达到这个目的。 还要注意破坏对话框和启用父对话框的调用顺序。 父窗口必须在对话框被销毁之前启用,因为禁用的窗口不能接收焦点或激活。 DestroyWindow将想分配激活到一个窗口 如果父窗口被禁用,另一个顶级窗口将被选择并激活- 通常不是预期的结果。 本文转载于:http://www.diyabc.com/frontweb/news8204.html

浙公网安备 33010602011771号