X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d53fc3442b92a52dd24a40fee6a201c1b931987..1483041dab88f43563c26405c1e2a41d6babe6a0:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 3b555428be..1bf777979b 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -112,6 +112,8 @@ void wxFrame::Init() m_fsToolBarHeight = 0; // m_fsMenu = 0; + m_wasMinimized = FALSE; + m_winLastFocused = (wxWindow *)NULL; } @@ -126,7 +128,7 @@ bool wxFrame::Create(wxWindow *parent, if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) ) return FALSE; - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); wxModelessWindows.Append(this); @@ -140,30 +142,9 @@ wxFrame::~wxFrame() DeleteAllBars(); } -// Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. -void wxFrame::DoGetClientSize(int *x, int *y) const -{ - RECT rect; - ::GetClientRect(GetHwnd(), &rect); - -#if wxUSE_STATUSBAR - if ( GetStatusBar() && GetStatusBar()->IsShown() ) - { - int statusX, statusY; - GetStatusBar()->GetClientSize(&statusX, &statusY); - rect.bottom -= statusY; - } -#endif // wxUSE_STATUSBAR - - wxPoint pt(GetClientAreaOrigin()); - rect.bottom -= pt.y; - rect.right -= pt.x; - - if ( x ) - *x = rect.right; - if ( y ) - *y = rect.bottom; -} +// ---------------------------------------------------------------------------- +// wxFrame client size calculations +// ---------------------------------------------------------------------------- void wxFrame::DoSetClientSize(int width, int height) { @@ -176,9 +157,40 @@ void wxFrame::DoSetClientSize(int width, int height) } #endif // wxUSE_STATUSBAR + // call GetClientAreaOrigin() to take the toolbar into account + wxPoint pt = GetClientAreaOrigin(); + width += pt.x; + height += pt.y; + wxTopLevelWindow::DoSetClientSize(width, height); } +// Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. +void wxFrame::DoGetClientSize(int *x, int *y) const +{ + wxTopLevelWindow::DoGetClientSize(x, y); + + // account for the possible toolbar + wxPoint pt = GetClientAreaOrigin(); + if ( x ) + *x -= pt.x; + + if ( y ) + *y -= pt.y; + +#if wxUSE_STATUSBAR + // adjust client area height to take the status bar into account + if ( y ) + { + wxStatusBar *statbar = GetStatusBar(); + if ( statbar && statbar->IsShown() ) + { + *y -= statbar->GetClientSize().y; + } + } +#endif // wxUSE_STATUSBAR +} + // ---------------------------------------------------------------------------- // wxFrame: various geometry-related functions // ---------------------------------------------------------------------------- @@ -232,7 +244,7 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, void wxFrame::PositionStatusBar() { - if ( !m_frameStatusBar ) + if ( !m_frameStatusBar || !m_frameStatusBar->IsShown() ) return; int w, h; @@ -295,7 +307,7 @@ void wxFrame::InternalSetMenuBar() // Responds to colour changes, and passes event on to children. void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); Refresh(); #if wxUSE_STATUSBAR @@ -457,36 +469,40 @@ wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& nam void wxFrame::PositionToolBar() { - RECT rect; - ::GetClientRect(GetHwnd(), &rect); + wxToolBar *toolbar = GetToolBar(); + if ( toolbar && toolbar->IsShown() ) + { + // don't call our (or even wxTopLevelWindow) version because we want + // the real (full) client area size, not excluding the tool/status bar + int width, height; + wxWindow::DoGetClientSize(&width, &height); #if wxUSE_STATUSBAR - if ( GetStatusBar() ) - { - int statusX, statusY; - GetStatusBar()->GetClientSize(&statusX, &statusY); - rect.bottom -= statusY; - } + wxStatusBar *statbar = GetStatusBar(); + if ( statbar && statbar->IsShown() ) + { + height -= statbar->GetClientSize().y; + } #endif // wxUSE_STATUSBAR - if ( GetToolBar() && GetToolBar()->IsShown() ) - { int tw, th; - GetToolBar()->GetSize(&tw, &th); + toolbar->GetSize(&tw, &th); - if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL ) + if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) { - th = rect.bottom; + th = height; } else { - tw = rect.right; + tw = width; } - // Use the 'real' MSW position here - GetToolBar()->SetSize(0, 0, tw, th, wxSIZE_NO_ADJUSTMENTS); + // use the 'real' MSW position here, don't offset relativly to the + // client area origin + toolbar->SetSize(0, 0, tw, th, wxSIZE_NO_ADJUSTMENTS); } } + #endif // wxUSE_TOOLBAR // ---------------------------------------------------------------------------- @@ -523,7 +539,21 @@ void wxFrame::IconizeChildFrames(bool bIconize) #endif // wxUSE_MDI_ARCHITECTURE ) { - frame->Iconize(bIconize); + // we don't want to restore the child frames which had been + // iconized even before we were iconized, so save the child frame + // status when iconizing the parent frame and check it when + // restoring it + if ( bIconize ) + { + // note that we shouldn't touch the hidden frames neither + // because iconizing/restoring them would show them as a side + // effect + frame->m_wasMinimized = frame->IsIconized() || !frame->IsShown(); + } + + // this test works for both iconizing and restoring + if ( !frame->m_wasMinimized ) + frame->Iconize(bIconize); } } }