- void CMainDlg::DoTask()
- {
- CTaskDlg * pDlg = NULL;
- pDlg = new CTaskDlg(XML_FILE_NAME_TASK_DLG, WND_CLASS_NAME_TASK_DLG);
- pDlg->Create(this->m_hWnd, MAIN_RORG_DISP_NAME, UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); ///< 如果参数1是NULL, 为桌面, 子窗口就不是模态对话框
- pDlg->CenterWindow();
- pDlg->ShowModal(); ///< 弹出的是模态窗口
- }
因为要弹出模态对话框, 跟进 pDlg->ShowModal(), 看到了duilib禁止主窗口的代码, 才想到参数1应为父窗口窗口句柄.
可以看出, 当要弹出非模态窗口时, 可以将pDlg->Create 的参数1 填成 NULL.
- UINT CWindowWnd::ShowModal()
- {
- ASSERT(::IsWindow(m_hWnd));
- UINT nRet = 0;
- HWND hWndParent = GetWindowOwner(m_hWnd); ///< 如果子窗口创建时,参数1为NULL, 这里得到的 hWndParent 就为 NULL
- ::ShowWindow(m_hWnd, SW_SHOWNORMAL);
- ::EnableWindow(hWndParent, FALSE); ///< 当 (NULL == hWndParent) 时, EnableWindow 不生效, 导致弹出的是非模态窗口.
- MSG msg = { 0 };
- while( ::IsWindow(m_hWnd) && ::GetMessage(&msg, NULL, 0, 0) ) {
- if( msg.message == WM_CLOSE && msg.hwnd == m_hWnd ) {
- nRet = msg.wParam;
- ::EnableWindow(hWndParent, TRUE);
- ::SetFocus(hWndParent);
- }
- if( !CPaintManagerUI::TranslateMessage(&msg) ) {
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- }
- if( msg.message == WM_QUIT ) break;
- }
- ::EnableWindow(hWndParent, TRUE);
- ::SetFocus(hWndParent);
- if( msg.message == WM_QUIT ) ::PostQuitMessage(msg.wParam);
- return nRet;
- }