X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aaf803e981a7b21cf756479eb0764e278b836f12..e6733873f5bc5de9ef538533da786250de9dd9c7:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 1ec081f3f4..19a148224f 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,10 @@ #pragma hdrstop #endif +#include "wx/frame.h" + #ifndef WX_PRECOMP - #include "wx/frame.h" + #include "wx/msw/wrapcctl.h" // include "properly" #include "wx/app.h" #include "wx/menu.h" #include "wx/utils.h" @@ -38,25 +36,21 @@ #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 +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) + #include + #include + #include "wx/msw/winundef.h" #endif -#if wxUSE_STATUSBAR - #include "wx/statusbr.h" - #include "wx/generic/statusbr.h" -#endif // wxUSE_STATUSBAR - -#if wxUSE_TOOLBAR - #include "wx/toolbar.h" -#endif // wxUSE_TOOLBAR - -#include "wx/menuitem.h" -#include "wx/log.h" +#include "wx/generic/statusbr.h" #ifdef __WXUNIVERSAL__ #include "wx/univ/theme.h" @@ -113,10 +107,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) @@ -197,14 +195,14 @@ bool wxFrame::Create(wxWindow *parent, SetLeftMenu(wxID_EXIT, _("Done")); #endif -#if defined(__POCKETPC__) +#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 +#endif // wxUSE_ACCEL && __POCKETPC__ return true; } @@ -235,6 +233,22 @@ void wxFrame::DoSetClientSize(int width, int height) width += pt.x; height += pt.y; +#if wxUSE_TOOLBAR + wxToolBar * const toolbar = GetToolBar(); + if ( toolbar ) + { + if ( toolbar->HasFlag(wxTB_RIGHT | wxTB_BOTTOM) ) + { + const wxSize sizeTB = toolbar->GetSize(); + if ( toolbar->HasFlag(wxTB_RIGHT) ) + width -= sizeTB.x; + else // wxTB_BOTTOM + height -= sizeTB.y; + } + //else: toolbar already taken into account by GetClientAreaOrigin() + } +#endif // wxUSE_TOOLBAR + wxTopLevelWindow::DoSetClientSize(width, height); } @@ -251,6 +265,28 @@ void wxFrame::DoGetClientSize(int *x, int *y) const if ( y ) *y -= pt.y; +#if wxUSE_TOOLBAR + wxToolBar * const toolbar = GetToolBar(); + if ( toolbar ) + { + if ( toolbar->HasFlag(wxTB_RIGHT | wxTB_BOTTOM) ) + { + const wxSize sizeTB = toolbar->GetSize(); + if ( toolbar->HasFlag(wxTB_RIGHT) ) + { + if ( x ) + *x -= sizeTB.x; + } + else // wxTB_BOTTOM + { + if ( y ) + *y -= sizeTB.y; + } + } + //else: toolbar already taken into account by GetClientAreaOrigin() + } +#endif // wxUSE_TOOLBAR + #if wxUSE_STATUSBAR // adjust client area height to take the status bar into account if ( y ) @@ -317,13 +353,38 @@ void wxFrame::PositionStatusBar() int w, h; GetClientSize(&w, &h); + int sw, sh; m_frameStatusBar->GetSize(&sw, &sh); + int x = 0; +#if wxUSE_TOOLBAR + wxToolBar * const toolbar = GetToolBar(); + if ( toolbar && !toolbar->HasFlag(wxTB_TOP) ) + { + const wxSize sizeTB = toolbar->GetSize(); + + if ( toolbar->HasFlag(wxTB_LEFT | wxTB_RIGHT) ) + { + if ( toolbar->HasFlag(wxTB_LEFT) ) + x -= sizeTB.x; + + w += sizeTB.x; + } + else // wxTB_BOTTOM + { + // we need to position the status bar below the toolbar + h += sizeTB.y; + } + } + //else: no adjustments necessary for the toolbar on top +#endif // wxUSE_TOOLBAR + // Since we wish the status bar to be directly under the client area, // we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS. - m_frameStatusBar->SetSize(0, h, w, sh); + m_frameStatusBar->SetSize(x, h, w, sh); } + #endif // wxUSE_STATUSBAR #if wxUSE_MENUS_NATIVE @@ -357,7 +418,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); @@ -502,8 +563,27 @@ bool wxFrame::ShowFullScreen(bool show, long style) } #endif // wxUSE_TOOLBAR - if ((m_fsStyle & wxFULLSCREEN_NOMENUBAR) && m_hMenu) - ::SetMenu(GetHwnd(), (HMENU)m_hMenu); + if (m_fsStyle & wxFULLSCREEN_NOMENUBAR) + { + WXHMENU menu = m_hMenu; + +#if wxUSE_MDI_ARCHITECTURE + wxMDIParentFrame *frame = wxDynamicCast(this, wxMDIParentFrame); + if (frame) + { + wxMDIChildFrame *child = frame->GetActiveChild(); + if (child) + { + menu = child->GetWinMenu(); + } + } +#endif // wxUSE_MDI_ARCHITECTURE + + if (menu) + { + ::SetMenu(GetHwnd(), (HMENU)menu); + } + } #if wxUSE_STATUSBAR wxStatusBar *theStatusBar = GetStatusBar(); @@ -543,15 +623,13 @@ wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& nam void wxFrame::PositionToolBar() { + // TODO: we want to do something different in WinCE, because the toolbar + // should be associated with the commandbar, instead of being + // independent window. +#if !defined(WINCE_WITHOUT_COMMANDBAR) wxToolBar *toolbar = GetToolBar(); if ( toolbar && toolbar->IsShown() ) { -#if defined(WINCE_WITHOUT_COMMANDBAR) - // We want to do something different in WinCE, because - // the toolbar should be associated with the commandbar, - // and not an independent window. - // TODO -#else // don't call our (or even wxTopLevelWindow) version because we want // the real (full) client area size, not excluding the tool/status bar int width, height; @@ -565,8 +643,27 @@ void wxFrame::PositionToolBar() } #endif // wxUSE_STATUSBAR - int x = 0; - int y = 0; + int tx, ty, tw, th; + toolbar->GetPosition( &tx, &ty ); + toolbar->GetSize( &tw, &th ); + + int x = 0, y = 0; + if ( toolbar->HasFlag(wxTB_BOTTOM) ) + { + x = 0; + y = height - th; + } + else if ( toolbar->HasFlag(wxTB_RIGHT) ) + { + x = width - tw; + y = 0; + } + else // left or top + { + x = 0; + y = 0; + } + #if defined(WINCE_WITH_COMMANDBAR) // We're using a commandbar - so we have to allow for it. if (GetMenuBar() && GetMenuBar()->GetCommandBar()) @@ -575,31 +672,40 @@ void wxFrame::PositionToolBar() ::GetWindowRect((HWND) GetMenuBar()->GetCommandBar(), &rect); y = rect.bottom - rect.top; } -#endif - - int tx, ty; - int tw, th; - toolbar->GetPosition(&tx, &ty); - toolbar->GetSize(&tw, &th); +#endif // WINCE_WITH_COMMANDBAR - // Adjust - if (ty < 0 && (-ty == th)) - ty = 0; - if (tx < 0 && (-tx == tw)) - tx = 0; + if ( toolbar->HasFlag(wxTB_BOTTOM) ) + { + if ( ty < 0 && ( -ty == th ) ) + ty = height - th; + if ( tx < 0 && (-tx == tw ) ) + tx = 0; + } + else if ( toolbar->HasFlag(wxTB_RIGHT) ) + { + if( ty < 0 && ( -ty == th ) ) + ty = 0; + if( tx < 0 && ( -tx == tw ) ) + tx = width - tw; + } + else // left or top + { + if (ty < 0 && (-ty == th)) + ty = 0; + if (tx < 0 && (-tx == tw)) + tx = 0; + } int desiredW = tw; int desiredH = th; - if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) + if ( toolbar->IsVertical() ) { desiredH = height; } else { desiredW = width; -// if ( toolbar->GetWindowStyleFlag() & wxTB_FLAT ) -// desiredW -= 3; } // use the 'real' MSW position here, don't offset relativly to the @@ -610,7 +716,7 @@ void wxFrame::PositionToolBar() bool heightChanging wxDUMMY_INITIALIZE(true); bool widthChanging wxDUMMY_INITIALIZE(true); - if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) + if ( toolbar->IsVertical() ) { // It's OK if the current height is greater than what can be shown. heightChanging = (desiredH > th) ; @@ -634,8 +740,8 @@ void wxFrame::PositionToolBar() if (tx != 0 || ty != 0 || widthChanging || heightChanging) toolbar->SetSize(x, y, desiredW, desiredH, wxSIZE_NO_ADJUSTMENTS); -#endif // __WXWINCE__ } +#endif // !WINCE_WITH_COMMANDBAR } #endif // wxUSE_TOOLBAR @@ -662,17 +768,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 - && !IsMDIChild() + && !frame->IsMDIChild() #endif // wxUSE_MDI_ARCHITECTURE ) { @@ -707,7 +811,7 @@ WXHICON wxFrame::GetDefaultIcon() const // preprocessing // --------------------------------------------------------------------------- -bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) +bool wxFrame::MSWDoTranslateMessage(wxFrame *frame, WXMSG *pMsg) { if ( wxWindow::MSWTranslateMessage(pMsg) ) return true; @@ -715,14 +819,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 } // --------------------------------------------------------------------------- @@ -1030,19 +1134,18 @@ wxPoint wxFrame::GetClientAreaOrigin() const #if wxUSE_TOOLBAR && !defined(__WXUNIVERSAL__) && \ (!defined(__WXWINCE__) || (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__))) - wxToolBar *toolbar = GetToolBar(); + wxToolBar * const toolbar = GetToolBar(); if ( toolbar && toolbar->IsShown() ) { - int w, h; - toolbar->GetSize(&w, &h); + const wxSize sizeTB = toolbar->GetSize(); - if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) + if ( toolbar->HasFlag(wxTB_TOP) ) { - pt.x += w; + pt.y += sizeTB.y; } - else + else if ( toolbar->HasFlag(wxTB_LEFT) ) { - pt.y += h; + pt.x += sizeTB.x; } } #endif // wxUSE_TOOLBAR