X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cbe874bd32f35beb3ed8d019c5a24df21a219f8f..4f450f41a2c02db9c35e3e566b381c85b5714de8:/src/msw/frame.cpp?ds=sidebyside diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 0fd73e50bc..800cd97d86 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/frame.cpp +// Name: src/msw/frame.cpp // Purpose: wxFrame // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "frame.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,8 +24,9 @@ #pragma hdrstop #endif +#include "wx/frame.h" + #ifndef WX_PRECOMP - #include "wx/frame.h" #include "wx/app.h" #include "wx/menu.h" #include "wx/utils.h" @@ -38,25 +35,24 @@ #include "wx/dcclient.h" #include "wx/mdi.h" #include "wx/panel.h" + #include "wx/log.h" + #include "wx/toolbar.h" + #include "wx/statusbr.h" + #include "wx/menuitem.h" #endif // WX_PRECOMP #include "wx/msw/private.h" -#ifdef __WXWINCE__ -#include -#endif - -#if wxUSE_STATUSBAR - #include "wx/statusbr.h" - #include "wx/generic/statusbr.h" -#endif // wxUSE_STATUSBAR +// include "properly" +#include "wx/msw/wrapcctl.h" -#if wxUSE_TOOLBAR - #include "wx/toolbar.h" -#endif // wxUSE_TOOLBAR +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) + #include + #include + #include "wx/msw/winundef.h" +#endif -#include "wx/menuitem.h" -#include "wx/log.h" +#include "wx/generic/statusbr.h" #ifdef __WXUNIVERSAL__ #include "wx/univ/theme.h" @@ -113,10 +109,14 @@ wxBEGIN_FLAGS( wxFrameStyle ) // frame styles wxFLAGS_MEMBER(wxSTAY_ON_TOP) wxFLAGS_MEMBER(wxCAPTION) +#if WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxTHICK_FRAME) +#endif // WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxSYSTEM_MENU) wxFLAGS_MEMBER(wxRESIZE_BORDER) +#if WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxRESIZE_BOX) +#endif // WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxCLOSE_BOX) wxFLAGS_MEMBER(wxMAXIMIZE_BOX) wxFLAGS_MEMBER(wxMINIMIZE_BOX) @@ -169,15 +169,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow) void wxFrame::Init() { +#if wxUSE_MENUS + m_hMenu = NULL; +#endif // wxUSE_MENUS + #if wxUSE_TOOLTIPS m_hwndToolTip = 0; #endif - // Data to save/restore when calling ShowFullScreen - m_fsStatusBarFields = 0; - m_fsStatusBarHeight = 0; - m_fsToolBarHeight = 0; - m_wasMinimized = false; } @@ -192,12 +191,21 @@ bool wxFrame::Create(wxWindow *parent, if ( !wxTopLevelWindow::Create(parent, id, title, pos, size, style, name) ) return false; - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); + SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); -#ifdef __SMARTPHONE__ +#if defined(__SMARTPHONE__) SetLeftMenu(wxID_EXIT, _("Done")); #endif +#if wxUSE_ACCEL && defined(__POCKETPC__) + // The guidelines state that Ctrl+Q should quit the app. + // Let's define an accelerator table to send wxID_EXIT. + wxAcceleratorEntry entries[1]; + entries[0].Set(wxACCEL_CTRL, 'Q', wxID_EXIT); + wxAcceleratorTable accel(1, entries); + SetAcceleratorTable(accel); +#endif // wxUSE_ACCEL && __POCKETPC__ + return true; } @@ -322,7 +330,7 @@ void wxFrame::PositionStatusBar() void wxFrame::AttachMenuBar(wxMenuBar *menubar) { -#if defined(__SMARTPHONE__) +#if defined(__SMARTPHONE__) && defined(__WXWINCE__) wxMenu *autoMenu = NULL; @@ -349,7 +357,7 @@ void wxFrame::AttachMenuBar(wxMenuBar *menubar) #elif defined(WINCE_WITHOUT_COMMANDBAR) if (!GetToolBar()) { - wxToolBar* toolBar = new wxToolBar(this, wxID_ANY, + wxToolMenuBar* toolBar = new wxToolMenuBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE | wxTB_HORIZONTAL, wxToolBarNameStr, menubar); @@ -420,7 +428,7 @@ void wxFrame::InternalSetMenuBar() // Responds to colour changes, and passes event on to children. void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { - SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); + SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); Refresh(); #if wxUSE_STATUSBAR @@ -439,92 +447,94 @@ void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) // Pass true to show full screen, false to restore. bool wxFrame::ShowFullScreen(bool show, long style) { + // TODO-CE: add support for CE +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) if ( IsFullScreen() == show ) return false; if (show) { + // zap the toolbar, menubar, and statusbar if needed + // + // TODO: hide commandbar for WINCE_WITH_COMMANDBAR #if wxUSE_TOOLBAR - -#if defined(WINCE_WITH_COMMANDBAR) - // TODO: hide commandbar -#else wxToolBar *theToolBar = GetToolBar(); - if (theToolBar) - theToolBar->GetSize(NULL, &m_fsToolBarHeight); - - // zap the toolbar, menubar, and statusbar if ((style & wxFULLSCREEN_NOTOOLBAR) && theToolBar) { - theToolBar->SetSize(wxDefaultCoord,0); - theToolBar->Show(false); + if ( theToolBar->IsShown() ) + { + theToolBar->SetSize(wxDefaultCoord,0); + theToolBar->Show(false); + } + else // prevent it from being restored later + { + style &= ~wxFULLSCREEN_NOTOOLBAR; + } } -#endif // __WXWINCE__ #endif // wxUSE_TOOLBAR -#if defined(__WXMICROWIN__) -#elif defined(__WXWINCE__) - // TODO: make it work for WinCE -#else if (style & wxFULLSCREEN_NOMENUBAR) SetMenu((HWND)GetHWND(), (HMENU) NULL); -#endif #if wxUSE_STATUSBAR wxStatusBar *theStatusBar = GetStatusBar(); - if (theStatusBar) - theStatusBar->GetSize(NULL, &m_fsStatusBarHeight); // Save the number of fields in the statusbar if ((style & wxFULLSCREEN_NOSTATUSBAR) && theStatusBar) { - //m_fsStatusBarFields = theStatusBar->GetFieldsCount(); - //SetStatusBar((wxStatusBar*) NULL); - //delete theStatusBar; - theStatusBar->Show(false); + if ( theStatusBar->IsShown() ) + theStatusBar->Show(false); + else + style &= ~wxFULLSCREEN_NOSTATUSBAR; } - else - m_fsStatusBarFields = 0; #endif // wxUSE_STATUSBAR } - else + else // restore to normal { + // restore the toolbar, menubar, and statusbar if we had hid them #if wxUSE_TOOLBAR -#if defined(WINCE_WITHOUT_COMMANDBAR) - // TODO: show commandbar -#else wxToolBar *theToolBar = GetToolBar(); - // restore the toolbar, menubar, and statusbar - if (theToolBar && (m_fsStyle & wxFULLSCREEN_NOTOOLBAR)) + if ((m_fsStyle & wxFULLSCREEN_NOTOOLBAR) && theToolBar) { - theToolBar->SetSize(wxDefaultCoord, m_fsToolBarHeight); theToolBar->Show(true); } -#endif // __WXWINCE__ #endif // wxUSE_TOOLBAR -#if wxUSE_STATUSBAR - if ( m_fsStyle & wxFULLSCREEN_NOSTATUSBAR ) + if (m_fsStyle & wxFULLSCREEN_NOMENUBAR) { - //CreateStatusBar(m_fsStatusBarFields); - if (GetStatusBar()) + WXHMENU menu = m_hMenu; + +#if wxUSE_MDI_ARCHITECTURE + wxMDIParentFrame *frame = wxDynamicCast(this, wxMDIParentFrame); + if (frame) { - GetStatusBar()->Show(true); - PositionStatusBar(); + wxMDIChildFrame *child = frame->GetActiveChild(); + if (child) + { + menu = child->GetWinMenu(); + } + } +#endif // wxUSE_MDI_ARCHITECTURE + + if (menu) + { + ::SetMenu(GetHwnd(), (HMENU)menu); } } -#endif // wxUSE_STATUSBAR -#if defined(__WXMICROWIN__) -#elif defined(__WXWINCE__) - // TODO: make it work for WinCE -#else - if ((m_fsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0)) - SetMenu((HWND)GetHWND(), (HMENU)m_hMenu); -#endif +#if wxUSE_STATUSBAR + wxStatusBar *theStatusBar = GetStatusBar(); + + if ((m_fsStyle & wxFULLSCREEN_NOSTATUSBAR) && theStatusBar) + { + theStatusBar->Show(true); + PositionStatusBar(); + } +#endif // wxUSE_STATUSBAR } +#endif // !defined(__WXMICROWIN__) && !defined(__WXWINCE__) return wxFrameBase::ShowFullScreen(show, style); } @@ -658,6 +668,8 @@ void wxFrame::PositionToolBar() // on the desktop, but are iconized/restored with it void wxFrame::IconizeChildFrames(bool bIconize) { + m_iconized = bIconize; + for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); node; node = node->GetNext() ) @@ -669,17 +681,15 @@ void wxFrame::IconizeChildFrames(bool bIconize) // 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 #if wxUSE_MDI_ARCHITECTURE - && !wxDynamicCast(frame, wxMDIChildFrame) + && !frame->IsMDIChild() #endif // wxUSE_MDI_ARCHITECTURE ) { @@ -714,7 +724,7 @@ WXHICON wxFrame::GetDefaultIcon() const // preprocessing // --------------------------------------------------------------------------- -bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) +bool wxFrame::MSWDoTranslateMessage(wxFrame *frame, WXMSG *pMsg) { if ( wxWindow::MSWTranslateMessage(pMsg) ) return true; @@ -722,14 +732,14 @@ bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) #if wxUSE_MENUS && wxUSE_ACCEL && !defined(__WXUNIVERSAL__) // try the menu bar accels wxMenuBar *menuBar = GetMenuBar(); - if ( !menuBar ) - return false; + if ( menuBar ) + { + const wxAcceleratorTable& acceleratorTable = menuBar->GetAccelTable(); + return acceleratorTable.Translate(frame, pMsg); + } +#endif // wxUSE_MENUS && wxUSE_ACCEL - const wxAcceleratorTable& acceleratorTable = menuBar->GetAccelTable(); - return acceleratorTable.Translate(this, pMsg); -#else return false; -#endif // wxUSE_MENUS && wxUSE_ACCEL } // --------------------------------------------------------------------------- @@ -788,14 +798,13 @@ bool wxFrame::HandlePaint() } } -bool wxFrame::HandleSize(int x, int y, WXUINT id) +bool wxFrame::HandleSize(int WXUNUSED(x), int WXUNUSED(y), WXUINT id) { - bool processed = false; #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) - switch ( id ) { - case SIZENORMAL: + case SIZE_RESTORED: + case SIZE_MAXIMIZED: // only do it it if we were iconized before, otherwise resizing the // parent frame has a curious side effect of bringing it under it's // children @@ -806,23 +815,16 @@ bool wxFrame::HandleSize(int x, int y, WXUINT id) IconizeChildFrames(false); (void)SendIconizeEvent(false); - - // fall through - - case SIZEFULLSCREEN: - m_iconized = FALSE; break; - case SIZEICONIC: + case SIZE_MINIMIZED: // iconize all child frames too IconizeChildFrames(true); - - (void)SendIconizeEvent(); - - m_iconized = true; break; } -#endif +#else + wxUnusedVar(id); +#endif // !__WXWINCE__ if ( !m_iconized ) { @@ -848,13 +850,11 @@ bool wxFrame::HandleSize(int x, int y, WXUINT id) } } -#endif - - - processed = wxWindow::HandleSize(x, y, id); +#endif // WINCE_WITH_COMMANDBAR } - return processed; + // call the base class version to generate the appropriate events + return false; } bool wxFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) @@ -880,13 +880,13 @@ bool wxFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) } #endif // wxUSE_MENUS_NATIVE -#ifdef __SMARTPHONE__ +#if defined(__SMARTPHONE__) && defined(__WXWINCE__) // handle here commands from Smartphone menu bar if ( wxTopLevelWindow::HandleCommand(id, cmd, control ) ) { return true; } -#endif // __SMARTPHONE__ +#endif // __SMARTPHONE__ && __WXWINCE__ if ( ProcessCommand(id) ) { @@ -990,7 +990,7 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara break; case WM_EXITMENULOOP: - processed = HandleMenuLoop(wxEVT_MENU_CLOSE, wParam); + processed = HandleMenuLoop(wxEVT_MENU_CLOSE, (WXWORD)wParam); break; case WM_QUERYDRAGICON: