void wxFrame::Init()
{
- m_iconized = FALSE;
+ m_iconized =
+ m_maximizeOnShow = FALSE;
#if wxUSE_TOOLTIPS
m_hwndToolTip = 0;
m_iconized = FALSE;
- // we pass NULL as parent to MSWCreate because frames with parents behave
- // very strangely under Win95 shell
- // Alteration by JACS: keep normal Windows behaviour (float on top of parent)
- // with this style.
- if ((m_windowStyle & wxFRAME_FLOAT_ON_PARENT) == 0)
- parent = NULL;
-
wxTopLevelWindows.Append(this);
MSWCreate(m_windowId, parent, wxFrameClassName, this, title,
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()
#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,
WXDWORD extendedStyle = MakeExtendedStyle(style);
+ // make all frames appear in the win9x shell taskbar unless
+ // 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)
- extendedStyle |= WS_EX_TOOLWINDOW;
+ if ( (style & wxFRAME_TOOL_WINDOW) ||
+ (style & wxFRAME_NO_TASKBAR) )
+ extendedStyle |= WS_EX_TOOLWINDOW;
+ else if ( !(style & wxFRAME_NO_TASKBAR) )
+ extendedStyle |= WS_EX_APPWINDOW;
#endif
if (style & wxSTAY_ON_TOP)
// 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"),
// 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);
}