Duilib 模态对话框和非模态对话框

来源:互联网 发布:c语言标准库函数 下载 编辑:程序博客网 时间:2024/04/29 01:45
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CMainDlg::DoTask()  
  2. {  
  3.     CTaskDlg * pDlg = NULL;  
  4.   
  5.     pDlg = new CTaskDlg(XML_FILE_NAME_TASK_DLG, WND_CLASS_NAME_TASK_DLG);  
  6.     pDlg->Create(this->m_hWnd, MAIN_RORG_DISP_NAME, UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); ///< 如果参数1是NULL, 为桌面, 子窗口就不是模态对话框  
  7.     pDlg->CenterWindow();  
  8.     pDlg->ShowModal(); ///< 弹出的是模态窗口  
  9. }  


pDlg->Create 的参数1,开始写成了NULL, 子窗口弹出后, 还可以操作主窗口.

因为要弹出模态对话框, 跟进 pDlg->ShowModal(),  看到了duilib禁止主窗口的代码,  才想到参数1应为父窗口窗口句柄.

可以看出, 当要弹出非模态窗口时, 可以将pDlg->Create 的参数1 填成 NULL.


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. UINT CWindowWnd::ShowModal()  
  2. {  
  3.     ASSERT(::IsWindow(m_hWnd));  
  4.     UINT nRet = 0;  
  5.     HWND hWndParent = GetWindowOwner(m_hWnd); ///< 如果子窗口创建时,参数1为NULL, 这里得到的 hWndParent 就为 NULL  
  6.     ::ShowWindow(m_hWnd, SW_SHOWNORMAL);  
  7.     ::EnableWindow(hWndParent, FALSE); ///< 当 (NULL == hWndParent) 时, EnableWindow 不生效, 导致弹出的是非模态窗口.  
  8.     MSG msg = { 0 };  
  9.     while( ::IsWindow(m_hWnd) && ::GetMessage(&msg, NULL, 0, 0) ) {  
  10.         if( msg.message == WM_CLOSE && msg.hwnd == m_hWnd ) {  
  11.             nRet = msg.wParam;  
  12.             ::EnableWindow(hWndParent, TRUE);  
  13.             ::SetFocus(hWndParent);  
  14.         }  
  15.         if( !CPaintManagerUI::TranslateMessage(&msg) ) {  
  16.             ::TranslateMessage(&msg);  
  17.             ::DispatchMessage(&msg);  
  18.         }  
  19.         if( msg.message == WM_QUIT ) break;  
  20.     }  
  21.     ::EnableWindow(hWndParent, TRUE);  
  22.     ::SetFocus(hWndParent);  
  23.     if( msg.message == WM_QUIT ) ::PostQuitMessage(msg.wParam);  
  24.     return nRet;  
  25. }  
0 0