X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/579b10c2bed50f61070d0e8481749362732c959f..2b813b73cd79cfb4d275e9628811f379e8c5ee39:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index fb57117e50..6723824373 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -147,13 +147,6 @@ bool wxFrame::Create(wxWindow *parent, 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, @@ -364,6 +357,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, @@ -672,14 +686,25 @@ 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 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) extendedStyle |= WS_EX_TOPMOST; +#ifndef __WIN16__ + if (m_exStyle & wxFRAME_EX_CONTEXTHELP) + extendedStyle |= WS_EX_CONTEXTHELP; +#endif + m_iconized = FALSE; if ( !wxWindow::MSWCreate(id, parent, wclass, wx_win, title, x, y, width, height, msflags, NULL, extendedStyle) ) @@ -702,18 +727,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"), @@ -804,7 +846,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); }