X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b0a6bb75bcd4b5a4873d766a9208ac6376fe8625..87df17a11b0017d31c09f767bd921abb27193bee:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index be0e9d10e2..b37499c2fa 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -95,7 +95,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) void wxFrame::Init() { - m_iconized = FALSE; + m_iconized = + m_maximizeOnShow = FALSE; #if wxUSE_TOOLTIPS m_hwndToolTip = 0; @@ -218,62 +219,61 @@ void wxFrame::DoGetClientSize(int *x, int *y) const // to wxWindows) void wxFrame::DoSetClientSize(int width, int height) { - HWND hWnd = GetHwnd(); + HWND hWnd = GetHwnd(); - RECT rect; - ::GetClientRect(hWnd, &rect); + RECT rectClient; + ::GetClientRect(hWnd, &rectClient); - RECT rect2; - GetWindowRect(hWnd, &rect2); + RECT rectTotal; + ::GetWindowRect(hWnd, &rectTotal); - // Find the difference between the entire window (title bar and all) - // and the client area; add this to the new client size to move the - // window - int actual_width = rect2.right - rect2.left - rect.right + width; - int actual_height = rect2.bottom - rect2.top - rect.bottom + height; + // Find the difference between the entire window (title bar and all) + // and the client area; add this to the new client size to move the + // window + width += rectTotal.right - rectTotal.left - rectClient.right; + height += rectTotal.bottom - rectTotal.top - rectClient.bottom; #if wxUSE_STATUSBAR - if ( GetStatusBar() && GetStatusBar()->IsShown()) - { - int statusX, statusY; - GetStatusBar()->GetClientSize(&statusX, &statusY); - actual_height += statusY; - } + wxStatusBar *statbar = GetStatusBar(); + if ( statbar && statbar->IsShown() ) + { + // leave enough space for the status bar + height += statbar->GetSize().y; + } #endif // wxUSE_STATUSBAR - wxPoint pt(GetClientAreaOrigin()); - actual_width += pt.y; - actual_height += pt.x; - - POINT point; - point.x = rect2.left; - point.y = rect2.top; + // note that this takes the toolbar into account + wxPoint pt = GetClientAreaOrigin(); + width += pt.x; + height += pt.y; - MoveWindow(hWnd, point.x, point.y, actual_width, actual_height, (BOOL)TRUE); + if ( !::MoveWindow(hWnd, rectTotal.left, rectTotal.top, + width, height, TRUE /* redraw */) ) + { + wxLogLastError(_T("MoveWindow")); + } - wxSizeEvent event(wxSize(width, height), m_windowId); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); + wxSizeEvent event(wxSize(width, height), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); } void wxFrame::DoGetSize(int *width, int *height) const { - RECT rect; - GetWindowRect(GetHwnd(), &rect); - *width = rect.right - rect.left; - *height = rect.bottom - rect.top; + RECT rect; + ::GetWindowRect(GetHwnd(), &rect); + + *width = rect.right - rect.left; + *height = rect.bottom - rect.top; } void wxFrame::DoGetPosition(int *x, int *y) const { - RECT rect; - GetWindowRect(GetHwnd(), &rect); - POINT point; - point.x = rect.left; - point.y = rect.top; + RECT rect; + ::GetWindowRect(GetHwnd(), &rect); - *x = point.x; - *y = point.y; + *x = rect.left; + *y = rect.top; } // ---------------------------------------------------------------------------- @@ -293,7 +293,27 @@ bool wxFrame::Show(bool show) if ( !wxWindowBase::Show(show) ) return FALSE; - DoShowWindow(show ? SW_SHOW : SW_HIDE); + int nShowCmd; + if ( show ) + { + if ( m_maximizeOnShow ) + { + // show and maximize + nShowCmd = SW_MAXIMIZE; + + m_maximizeOnShow = FALSE; + } + else // just show + { + nShowCmd = SW_SHOW; + } + } + else // hide + { + nShowCmd = SW_HIDE; + } + + DoShowWindow(nShowCmd); if ( show ) { @@ -303,7 +323,7 @@ bool wxFrame::Show(bool show) event.SetEventObject( this ); GetEventHandler()->ProcessEvent(event); } - else + else // hide { // Try to highlight the correct window (the parent) if ( GetParent() ) @@ -324,7 +344,17 @@ void wxFrame::Iconize(bool iconize) void wxFrame::Maximize(bool maximize) { - DoShowWindow(maximize ? SW_MAXIMIZE : SW_RESTORE); + if ( IsShown() ) + { + // just maximize it directly + DoShowWindow(maximize ? SW_MAXIMIZE : SW_RESTORE); + } + else // hidden + { + // we can't maximize the hidden frame because it shows it as well, so + // just remember that we should do it later in this case + m_maximizeOnShow = TRUE; + } } void wxFrame::Restore() @@ -357,6 +387,27 @@ void wxFrame::SetIcon(const wxIcon& icon) #endif // __WIN95__ } +// generate an artificial resize event +void wxFrame::SendSizeEvent() +{ + RECT r; +#ifdef __WIN16__ + ::GetWindowRect(GetHwnd(), &r); +#else + if ( !::GetWindowRect(GetHwnd(), &r) ) + { + wxLogLastError(_T("GetWindowRect")); + } +#endif + + if ( !m_iconized ) + { + (void)::PostMessage(GetHwnd(), WM_SIZE, + IsMaximized() ? SIZE_MAXIMIZED : SIZE_RESTORED, + MAKELPARAM(r.right - r.left, r.bottom - r.top)); + } +} + #if wxUSE_STATUSBAR wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, @@ -666,12 +717,13 @@ bool wxFrame::MSWCreate(int id, wxWindow *parent, const wxChar *wclass, wxWindow WXDWORD extendedStyle = MakeExtendedStyle(style); // make all frames appear in the win9x shell taskbar unless - // wxFRAME_TOOL_WINDOW is explicitly given - without giving them + // wxFRAME_TOOL_WINDOW or wxFRAME_NO_TASKBAR is given - without giving them // WS_EX_APPWINDOW style, the child (i.e. owned) frames wouldn't appear in it #if !defined(__WIN16__) && !defined(__SC__) - if (style & wxFRAME_TOOL_WINDOW) + if ( (style & wxFRAME_TOOL_WINDOW) || + (style & wxFRAME_NO_TASKBAR) ) extendedStyle |= WS_EX_TOOLWINDOW; - else + else if ( !(style & wxFRAME_NO_TASKBAR) ) extendedStyle |= WS_EX_APPWINDOW; #endif @@ -705,18 +757,35 @@ void wxFrame::OnActivate(wxActivateEvent& event) // restore focus to the child which was last focused wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd); - wxSetFocusToChild(this, &m_winLastFocused); + wxWindow *parent = m_winLastFocused ? m_winLastFocused->GetParent() + : NULL; + if ( !parent ) + { + parent = this; + } + + wxSetFocusToChild(parent, &m_winLastFocused); } - else + else // deactivating { - // remember the last focused child + // remember the last focused child if it is our child m_winLastFocused = FindFocus(); - while ( m_winLastFocused ) + + // so we NULL it out if it's a child from some other frame + wxWindow *win = m_winLastFocused; + while ( win ) { - if ( GetChildren().Find(m_winLastFocused) ) + if ( win->IsTopLevel() ) + { + if ( win != this ) + { + m_winLastFocused = NULL; + } + break; + } - m_winLastFocused = m_winLastFocused->GetParent(); + win = win->GetParent(); } wxLogTrace(_T("focus"), @@ -807,7 +876,7 @@ void wxFrame::IconizeChildFrames(bool bIconize) // the child MDI frames are a special case and should not be touched by // the parent frame - instead, they are managed by the user wxFrame *frame = wxDynamicCast(win, wxFrame); - if ( frame && !wxDynamicCast(frame, wxMDIChildFrame) ) + if ( frame && !frame->IsMDIChild() ) { frame->Iconize(bIconize); } @@ -905,6 +974,8 @@ bool wxFrame::HandleSize(int x, int y, WXUINT id) // restore all child frames too IconizeChildFrames(FALSE); + (void)SendIconizeEvent(FALSE); + // fall through case SIZEFULLSCREEN: @@ -915,6 +986,8 @@ bool wxFrame::HandleSize(int x, int y, WXUINT id) // iconize all child frames too IconizeChildFrames(TRUE); + (void)SendIconizeEvent(); + m_iconized = TRUE; break; }