X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..a98f98ac6f4422f259fc3324975156f7554adf41:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 9a324b1042..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, @@ -523,9 +537,10 @@ bool wxFrame::ShowFullScreen(bool show, long style) // Save the number of fields in the statusbar if ((style & wxFULLSCREEN_NOSTATUSBAR) && theStatusBar) { - m_fsStatusBarFields = theStatusBar->GetFieldsCount(); - SetStatusBar((wxStatusBar*) NULL); - delete theStatusBar; + //m_fsStatusBarFields = theStatusBar->GetFieldsCount(); + //SetStatusBar((wxStatusBar*) NULL); + //delete theStatusBar; + theStatusBar->Show(FALSE); } else m_fsStatusBarFields = 0; @@ -587,10 +602,14 @@ bool wxFrame::ShowFullScreen(bool show, long style) theToolBar->Show(TRUE); } - if ((m_fsStyle & wxFULLSCREEN_NOSTATUSBAR) && (m_fsStatusBarFields > 0)) + if ((m_fsStyle & wxFULLSCREEN_NOSTATUSBAR)) // && (m_fsStatusBarFields > 0)) { - CreateStatusBar(m_fsStatusBarFields); - PositionStatusBar(); + //CreateStatusBar(m_fsStatusBarFields); + if (GetStatusBar()) + { + GetStatusBar()->Show(TRUE); + PositionStatusBar(); + } } if ((m_fsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0)) @@ -620,10 +639,17 @@ bool wxFrame::MSWCreate(int id, wxWindow *parent, const wxChar *wclass, wxWindow // could be the culprit. But without it, you can get a lot of flicker. DWORD msflags = 0; - if ((style & wxCAPTION) == wxCAPTION) - msflags = WS_OVERLAPPED; + if ( style & wxCAPTION ) + { + if ( style & wxFRAME_TOOL_WINDOW ) + msflags |= WS_POPUPWINDOW; + else + msflags |= WS_OVERLAPPED; + } else - msflags = WS_POPUP; + { + msflags |= WS_POPUP; + } if (style & wxMINIMIZE_BOX) msflags |= WS_MINIMIZEBOX; @@ -660,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) ) @@ -690,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"), @@ -779,10 +833,20 @@ void wxFrame::IconizeChildFrames(bool bIconize) { wxWindow *win = node->GetData(); + // iconizing the frames with this style under Win95 shell puts them at + // the bottom of the screen (as the MDI children) instead of making + // them appear in the taskbar because they are, by virtue of this + // style, not managed by the taskbar - instead leave Windows take care + // of them +#ifdef __WIN95__ + if ( win->GetWindowStyle() & wxFRAME_TOOL_WINDOW ) + continue; +#endif // Win95 + // 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); }