// 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(); }
// show dialog modally int wxDialog::ShowModal() { wxASSERT_MSG( !IsModal(), wxT("ShowModal() can't be called twice") ); Show(); // EndModal may have been called from InitDialog handler (called from // inside Show()) and hidden the dialog back again if ( IsShown() ) { // enter and run the modal loop wxDialogModalDataTiedPtr modalData(&m_modalData, new wxDialogModalData(this)); modalData->RunLoop(); } return GetReturnCode(); }
// // Replacement for Show(true) for modal dialogs - returns return code // int wxDialog::ShowModal() { WX_HOOK_MODAL_DIALOG(); wxASSERT_MSG( !IsModal(), wxT("wxDialog::ShowModal() reentered?") ); 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 * const parent = GetParentForModalDialog(); // remember where the focus was wxWindow *oldFocus = m_pOldFocus; 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; // // Before entering the modal loop, reset the "is in OnIdle()" flag (see // comment in app.cpp) // extern bool gbInOnIdle; bool bWasInOnIdle = gbInOnIdle; gbInOnIdle = false; // enter and run the modal loop { wxDialogModalDataTiedPtr modalData(&m_modalData, new wxDialogModalData(this)); modalData->RunLoop(); } gbInOnIdle = bWasInOnIdle; // 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) && ::WinIsWindow(vHabmain, hwndOldFocus)) { // This is likely to prove that the object still exists if (wxFindWinFromHandle((WXHWND) hwndOldFocus) == oldFocus) oldFocus->SetFocus(); } } return GetReturnCode(); } // end of wxDialog::ShowModal