void wxFrame::Init()
{
- m_iconized = FALSE;
+ m_iconized =
+ m_maximizeOnShow = FALSE;
#if wxUSE_TOOLTIPS
m_hwndToolTip = 0;
// 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;
}
// ----------------------------------------------------------------------------
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 )
{
event.SetEventObject( this );
GetEventHandler()->ProcessEvent(event);
}
- else
+ else // hide
{
// Try to highlight the correct window (the parent)
if ( GetParent() )
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()
// 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"),
// restore all child frames too
IconizeChildFrames(FALSE);
+ (void)SendIconizeEvent(FALSE);
+
// fall through
case SIZEFULLSCREEN:
// iconize all child frames too
IconizeChildFrames(TRUE);
+ (void)SendIconizeEvent();
+
m_iconized = TRUE;
break;
}