WEB开发网
开发学院软件开发VC Visual C++模态对话框消息处理机制的分析 阅读

Visual C++模态对话框消息处理机制的分析

 2008-11-14 19:33:15 来源:WEB开发网   
核心提示: {… …// Disable 父窗口 (在创建对话框前)HWND hWndParent = PreModal();AfxUnhookWindowCreate();BOOL bEnableParent = FALSE;if (hWndParent != NULL

{
 … …
 // Disable 父窗口 (在创建对话框前)
 HWND hWndParent = PreModal();
 AfxUnhookWindowCreate();
 BOOL bEnableParent = FALSE;
 if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
 {
  ::EnableWindow(hWndParent, FALSE);
  bEnableParent = TRUE;
 }
 TRY
 {
  // 创建模态对话框
  AfxHookWindowCreate(this);
  if (CreateDlgIndirect(lpDialogTemplate,CWnd::FromHandle(hWndParent), hInst))
  {
   if (m_nFlags & WF_CONTINUEMODAL)
   {
    // 进入模式循环
    DWORD dwFlags = MLF_SHOWONIDLE;
    if (GetStyle() & DS_NOIDLEMSG) dwFlags |= MLF_NOIDLEMSG;
      VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
   }
  }
 }
 CATCH_ALL(e)
 {
  DELETE_EXCEPTION(e);
  m_nModalResult = -1;
 }
 END_CATCH_ALL
 file://Enable 父窗口
 if (bEnableParent)
  ::EnableWindow(hWndParent, TRUE);
  if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
   ::SetActiveWindow(hWndParent);
   // 删除对话框
   DestroyWindow();
   PostModal();
   … …
 }

可以看到,在此实现代码中,并没有开辟新的线程。系统是在RunModalLoop()中进行消息循环。当 m_nFlags 为 WF_CONTINUEMODAL时,系统继续模式状态。RunModalLoop()函数实际上也是一for(;;)循环,控制重新分派Windows消息。直到ContinueModal()返回FALSE,而当调用EndModalLoop()时,ContinueModal()返回FALSE。此时,标志着模态显示的结束。因此,实现模态对话框消息处理的核心部分为RunModalLoop()和EndModalLoop()函数。

上一页  1 2 3 4  下一页

Tags:Visual 模态 对话框

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接