实现模态消息循环
总结 短语模态窗口用于描述在应用程序框架窗口上弹出的消息或对话框。 当模式窗口出现时,应用程序窗口不能使用。 系统提供了如下功能来创建模态窗口: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