choose implicit parent for the dialog boxes better, fixes weird focus jumps when using wxLog

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16927 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2002-09-02 00:44:24 +00:00
parent ae3047441e
commit a543e3ce7e
4 changed files with 34 additions and 13 deletions

View File

@ -253,6 +253,7 @@ wxMSW:
- fixed redraw problems in dynamically resized wxStaticText
- improvements to wxWindows applications behaviour when the system colours
are changed
- choose implicit parent for the dialog boxes better
- fixed wxProgressDialog for ranges > 65535
- wxSpinButton and wxSpinCtrl now support full 32 bit range (if the version
of comctl32.dll installed on the system supports it)

View File

@ -98,6 +98,12 @@ public:
#endif // wxUSE_CTL3D
protected:
// find the window to use as parent for this dialog if none has been
// specified explicitly by the user
//
// may return NULL
wxWindow *FindSuitableParent() const;
// show modal dialog and enter modal loop
void DoShowModal();

View File

@ -194,6 +194,28 @@ bool wxDialog::IsModalShowing() const
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") );
@ -285,12 +307,7 @@ bool wxDialog::Show(bool show)
// 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();

View File

@ -46,8 +46,7 @@ wxMessageDialog::wxMessageDialog(wxWindow *parent,
int wxMessageDialog::ShowModal()
{
wxWindow *winTop = wxTheApp->GetTopWindow();
if ( !winTop )
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
@ -58,11 +57,9 @@ int wxMessageDialog::ShowModal()
}
// use the top level window as parent if none specified
HWND hWnd = 0;
if ( m_parent )
hWnd = GetHwndOf(m_parent);
else if ( winTop )
hWnd = GetHwndOf(winTop);
if ( !m_parent )
m_parent = FindSuitableParent();
HWND hWnd = m_parent ? GetHwndOf(m_parent) : NULL;
// translate wx style in MSW
unsigned int msStyle = MB_OK;