return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast
}
+wxWindow *wxDialog::FindSuitableParent() const
+{
+ // first try to use the currently active window
+ HWND hwndFg = ::GetForegroundWindow();
+ wxWindow *parent = hwndFg ? wxFindWinFromHandle((WXHWND)hwndFg)
+ : NULL;
+ if ( !parent )
+ {
+ // next try the main app window
+ parent = wxTheApp->GetTopWindow();
+ }
+
+ // finally, check if the parent we found is really suitable
+ if ( !parent || parent == (wxWindow *)this || !parent->IsShown() )
+ {
+ // don't use this one
+ parent = NULL;
+ }
+
+ return parent;
+}
+
void wxDialog::DoShowModal()
{
wxCHECK_RET( !IsModalShowing(), _T("DoShowModal() called twice") );
m_windowDisabler = new wxWindowDisabler(this);
+ // before entering the modal loop, reset the "is in OnIdle()" flag (see
+ // comment in app.cpp)
+ extern bool wxIsInOnIdleFlag;
+ bool wasInOnIdle = wxIsInOnIdleFlag;
+ wxIsInOnIdleFlag = FALSE;
+
// enter the modal loop
while ( IsModalShowing() )
{
wxTheApp->DoMessage();
}
+ wxIsInOnIdleFlag = wasInOnIdle;
+
// 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
if ( show )
{
+ // dialogs don't get WM_SIZE message after creation unlike most (all?)
+ // other windows and so could start their life non laid out correctly
+ // if we didn't call Layout() from here
+ //
+ // NB: normally we should call it just the first time but doing it
+ // every time is simpler than keeping a flag
+ Layout();
+
// usually will result in TransferDataToWindow() being called
InitDialog();
}
// modal dialog needs a parent window, so try to find one
if ( !GetParent() )
{
- wxWindow *parent = wxTheApp->GetTopWindow();
- if ( parent && parent != this && parent->IsShown() )
- {
- // use it
- m_parent = parent;
- }
+ m_parent = FindSuitableParent();
}
DoShowModal();
// dialog window proc
// ---------------------------------------------------------------------------
-BOOL CALLBACK wxRefreshChildProc(HWND hwnd, LPARAM WXUNUSED(lParam))
-{
- ::InvalidateRect(hwnd, NULL, FALSE /* don't erase bg */);
-
- // continue enumeration
- return TRUE;
-}
-
long wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
{
long rc = 0;
processed = TRUE;
if ( !HasFlag(wxNO_FULL_REPAINT_ON_RESIZE) )
{
- ::EnumChildWindows(GetHwnd(), wxRefreshChildProc, 0);
+ ::InvalidateRect(GetHwnd(), NULL, FALSE /* erase bg */);
}
break;