实现模态消息循环

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

posted @ 2020-08-10 08:31  Dincat  阅读(281)  评论(0编辑  收藏  举报