BOOL CXTPPopupControl::ShowModal(CWnd* pParent) { CWinApp* pApp = AfxGetApp(); if (pApp != NULL) pApp->EnableModeless(FALSE); HWND hWndTop = 0; #if (_MSC_VER <= 1100) CWnd* pParentWnd = CWnd::GetSafeOwner(pParent, &hWndTop); HWND hWndParent = pParentWnd->GetSafeHwnd(); #else HWND hWndParent = CWnd::GetSafeOwner_(pParent->GetSafeHwnd(), &hWndTop); #endif BOOL bEnableParent = FALSE; if (hWndParent != NULL && ::IsWindowEnabled(hWndParent)) { ::EnableWindow(hWndParent, FALSE); bEnableParent = TRUE; } //create popup wnd if (Show(pParent)) { SetFocus(); RunModalLoop(MLF_NOIDLEMSG | MLF_NOKICKIDLE); } if (bEnableParent) ::EnableWindow(hWndParent, TRUE); if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd) ::SetActiveWindow(hWndParent); DestroyWindow(); // re-enable windows if (::IsWindow(hWndTop)) ::EnableWindow(hWndTop, TRUE); hWndTop = NULL; if (pApp != NULL) pApp->EnableModeless(TRUE); return TRUE; }
void CDialog::PostModal() { AfxUnhookWindowCreate(); // just in case Detach(); // just in case // re-enable windows if (::IsWindow(m_hWndTop)) ::EnableWindow(m_hWndTop, TRUE); m_hWndTop = NULL; CWinApp* pApp = AfxGetApp(); if (pApp != NULL) pApp->EnableModeless(TRUE); }
HWND CDialog::PreModal() { // cannot call DoModal on a dialog already constructed as modeless ASSERT(m_hWnd == NULL); // allow OLE servers to disable themselves CWinApp* pApp = AfxGetApp(); if (pApp != NULL) pApp->EnableModeless(FALSE); // find parent HWND HWND hWnd = CWnd::GetSafeOwner_(m_pParentWnd->GetSafeHwnd(), &m_hWndTop); // hook for creation of dialog AfxHookWindowCreate(this); // return window to use as parent for dialog return hWnd; }