// show dialog modally int wxDialog::ShowModal() { wxASSERT_MSG( !IsModal(), _T("wxDialog::ShowModal() reentered?") ); m_oldFocus = FindFocus(); m_endModalCalled = false; Show(); // EndModal may have been called from InitDialog handler (called from // inside Show()), which would cause an infinite loop if we didn't take it // into account if ( !m_endModalCalled ) { // modal dialog needs a parent window, so try to find one wxWindow *parent = GetParent(); if ( !parent ) { parent = FindSuitableParent(); } // remember where the focus was wxWindow *oldFocus = m_oldFocus; if ( !oldFocus ) { // VZ: do we really want to do this? oldFocus = parent; } // We have to remember the HWND because we need to check // the HWND still exists (oldFocus can be garbage when the dialog // exits, if it has been destroyed) HWND hwndOldFocus = oldFocus ? GetHwndOf(oldFocus) : NULL; // enter and run the modal loop { wxDialogModalDataTiedPtr modalData(&m_modalData, new wxDialogModalData(this)); modalData->RunLoop(); } // and restore focus // Note that this code MUST NOT access the dialog object's data // in case the object has been deleted (which will be the case // for a modal dialog that has been destroyed before calling EndModal). if ( oldFocus && (oldFocus != this) && ::IsWindow(hwndOldFocus)) { // This is likely to prove that the object still exists if (wxFindWinFromHandle((WXHWND) hwndOldFocus) == oldFocus) oldFocus->SetFocus(); } } return GetReturnCode(); }
int wxMessageDialog::ShowModal() { if ( !wxTheApp->GetTopWindow() ) { // when the message box is shown from wxApp::OnInit() (i.e. before the // message loop is entered), this must be done or the next message box // will never be shown - just try putting 2 calls to wxMessageBox() in // OnInit() to see it while ( wxTheApp->Pending() ) wxTheApp->Dispatch(); } // use the top level window as parent if none specified if ( !m_parent ) m_parent = FindSuitableParent(); HWND hWnd = m_parent ? GetHwndOf(m_parent) : NULL; // translate wx style in MSW unsigned int msStyle = MB_OK; const long wxStyle = GetMessageDialogStyle(); if (wxStyle & wxYES_NO) { #if !(defined(__SMARTPHONE__) && defined(__WXWINCE__)) if (wxStyle & wxCANCEL) msStyle = MB_YESNOCANCEL; else #endif // !(__SMARTPHONE__ && __WXWINCE__) msStyle = MB_YESNO; if (wxStyle & wxNO_DEFAULT) msStyle |= MB_DEFBUTTON2; } if (wxStyle & wxOK) { if (wxStyle & wxCANCEL) msStyle = MB_OKCANCEL; else msStyle = MB_OK; } if (wxStyle & wxICON_EXCLAMATION) msStyle |= MB_ICONEXCLAMATION; else if (wxStyle & wxICON_HAND) msStyle |= MB_ICONHAND; else if (wxStyle & wxICON_INFORMATION) msStyle |= MB_ICONINFORMATION; else if (wxStyle & wxICON_QUESTION) msStyle |= MB_ICONQUESTION; if ( wxStyle & wxSTAY_ON_TOP ) msStyle |= MB_TOPMOST; #ifndef __WXWINCE__ if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) msStyle |= MB_RTLREADING | MB_RIGHT; #endif if (hWnd) msStyle |= MB_APPLMODAL; else msStyle |= MB_TASKMODAL; // do show the dialog int msAns = MessageBox(hWnd, m_message.c_str(), m_caption.c_str(), msStyle); int ans; switch (msAns) { default: wxFAIL_MSG(_T("unexpected ::MessageBox() return code")); // fall through case IDCANCEL: ans = wxID_CANCEL; break; case IDOK: ans = wxID_OK; break; case IDYES: ans = wxID_YES; break; case IDNO: ans = wxID_NO; break; } return ans; }