X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7a9763046b9f7b99399d5538d204b3d8c03bbc2e..9967de02678d23a149183bc5908c7fadcd4f76eb:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 7cc30151f4..41b15c2875 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -232,20 +232,22 @@ void wxFrame::DoSetClientSize(int width, int height) wxPoint pt = GetClientAreaOrigin(); width += pt.x; height += pt.y; + #if wxUSE_TOOLBAR - if ( width ) + wxToolBar * const toolbar = GetToolBar(); + if ( toolbar ) { - wxToolBar *toolbar = GetToolBar(); - if ( toolbar && toolbar->HasFlag(wxTB_RIGHT) ) - { - width -= toolbar->GetClientSize().x; - } - if ( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) ) + if ( toolbar->HasFlag(wxTB_RIGHT | wxTB_BOTTOM) ) { - height -= toolbar->GetClientSize().y; + 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 +#endif // wxUSE_TOOLBAR wxTopLevelWindow::DoSetClientSize(width, height); } @@ -262,24 +264,29 @@ void wxFrame::DoGetClientSize(int *x, int *y) const if ( y ) *y -= pt.y; + #if wxUSE_TOOLBAR - if( y ) + wxToolBar * const toolbar = GetToolBar(); + if ( toolbar ) { - wxToolBar *toolbar = GetToolBar(); - if( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) ) + if ( toolbar->HasFlag(wxTB_RIGHT | wxTB_BOTTOM) ) { - *y -= toolbar->GetClientSize().y; - } - } - if ( x ) - { - wxToolBar *toolbar = GetToolBar(); - if ( toolbar && toolbar->HasFlag(wxTB_RIGHT) ) - { - *x -= toolbar->GetClientSize().x; + 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 +#endif // wxUSE_TOOLBAR + #if wxUSE_STATUSBAR // adjust client area height to take the status bar into account if ( y ) @@ -346,20 +353,38 @@ void wxFrame::PositionStatusBar() int w, h; GetClientSize(&w, &h); -#if wxUSE_TOOLBAR - wxToolBar *toolbar = GetToolBar(); - if( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) ) - h += toolbar->GetClientRect().height; - if( toolbar && toolbar->HasFlag( wxTB_RIGHT ) ) - w += toolbar->GetClientRect().width; -#endif + 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 @@ -373,7 +398,7 @@ void wxFrame::AttachMenuBar(wxMenuBar *menubar) if( menubar->GetMenuCount() == 1 ) { autoMenu = wxTopLevelWindowMSW::ButtonMenu::DuplicateMenu(menubar->GetMenu(0)); - SetRightMenu(wxID_ANY, menubar->GetLabelTop(0), autoMenu); + SetRightMenu(wxID_ANY, menubar->GetMenuLabel(0), autoMenu); } else { @@ -382,7 +407,7 @@ void wxFrame::AttachMenuBar(wxMenuBar *menubar) for( size_t n = 0; n < menubar->GetMenuCount(); n++ ) { wxMenu *item = menubar->GetMenu(n); - wxString label = menubar->GetLabelTop(n); + wxString label = menubar->GetMenuLabel(n); wxMenu *new_item = wxTopLevelWindowMSW::ButtonMenu::DuplicateMenu(item); autoMenu->Append(wxID_ANY, label, new_item); } @@ -472,7 +497,7 @@ void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { wxSysColourChangedEvent event2; event2.SetEventObject( m_frameStatusBar ); - m_frameStatusBar->GetEventHandler()->ProcessEvent(event2); + m_frameStatusBar->HandleWindowEvent(event2); } #endif // wxUSE_STATUSBAR @@ -538,6 +563,7 @@ bool wxFrame::ShowFullScreen(bool show, long style) } #endif // wxUSE_TOOLBAR +#if wxUSE_MENUS if (m_fsStyle & wxFULLSCREEN_NOMENUBAR) { WXHMENU menu = m_hMenu; @@ -559,6 +585,7 @@ bool wxFrame::ShowFullScreen(bool show, long style) ::SetMenu(GetHwnd(), (HMENU)menu); } } +#endif // wxUSE_MENUS #if wxUSE_STATUSBAR wxStatusBar *theStatusBar = GetStatusBar(); @@ -598,16 +625,13 @@ wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& nam void wxFrame::PositionToolBar() { - int x = 0, y = 0; + // 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; @@ -620,24 +644,28 @@ void wxFrame::PositionToolBar() height -= statbar->GetClientSize().y; } #endif // wxUSE_STATUSBAR - int tx, ty, tw, th; - toolbar->GetPosition( &tx, &ty ); - toolbar->GetSize( &tw, &th ); - if( ( toolbar->GetWindowStyleFlag() & wxTB_HORIZONTAL ) || ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) ) - { - x = 0; - y = 0; - } - else if( toolbar->GetWindowStyleFlag() & wxTB_BOTTOM ) - { - x = 0; - y = height - th; - } - else if( toolbar->HasFlag(wxTB_RIGHT) ) - { - x = width - tw; - 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()) @@ -646,29 +674,29 @@ void wxFrame::PositionToolBar() ::GetWindowRect((HWND) GetMenuBar()->GetCommandBar(), &rect); y = rect.bottom - rect.top; } -#endif - if( ( toolbar->GetWindowStyleFlag() & wxTB_HORIZONTAL ) || ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) ) - { - // Adjust - if (ty < 0 && (-ty == th)) - ty = 0; - if (tx < 0 && (-tx == tw)) - tx = 0; - } - else if( toolbar->GetWindowStyleFlag() & wxTB_BOTTOM ) - { - if( ty < 0 && ( -ty == th ) ) - ty = height - th; - if( tx < 0 && ( -tx == tw ) ) - tx = 0; - } - else if( toolbar->HasFlag(wxTB_RIGHT) ) +#endif // WINCE_WITH_COMMANDBAR + + 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; @@ -680,8 +708,6 @@ void wxFrame::PositionToolBar() else { desiredW = width; -// if ( toolbar->GetWindowStyleFlag() & wxTB_FLAT ) -// desiredW -= 3; } // use the 'real' MSW position here, don't offset relativly to the @@ -716,8 +742,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 @@ -827,7 +853,7 @@ bool wxFrame::HandlePaint() HDC hdc = ::BeginPaint(GetHwnd(), &ps); // Erase background before painting or we get white background - MSWDefWindowProc(WM_ICONERASEBKGND, (WORD)(LONG)ps.hdc, 0L); + MSWDefWindowProc(WM_ICONERASEBKGND, (WXWPARAM)ps.hdc, 0L); if ( hIcon ) { @@ -920,8 +946,11 @@ bool wxFrame::HandleSize(int WXUNUSED(x), int WXUNUSED(y), WXUINT id) return false; } -bool wxFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) +bool wxFrame::HandleCommand(WXWORD id_, WXWORD cmd, WXHWND control) { + // sign extend to int from short before comparing with the other int ids + int id = (signed short)id_; + if ( control ) { // In case it's e.g. a toolbar. @@ -960,6 +989,8 @@ bool wxFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) return false; } +#if wxUSE_MENUS + bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) { int item; @@ -980,7 +1011,7 @@ bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) // items opening popup menus (they don't have them anyhow) but do clear // the status line - otherwise, we would be left with the help message // for the previous item which doesn't apply any more - DoGiveHelp(wxEmptyString, false); + DoGiveHelp(wxEmptyString, true); return false; } @@ -988,7 +1019,7 @@ bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, item); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); } bool wxFrame::HandleMenuLoop(const wxEventType& evtType, WXWORD isPopup) @@ -998,9 +1029,33 @@ bool wxFrame::HandleMenuLoop(const wxEventType& evtType, WXWORD isPopup) wxMenuEvent event(evtType, isPopup ? -1 : 0); event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); + return HandleWindowEvent(event); +} + +bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu) +{ + wxMenu* menu = NULL; + if (GetMenuBar()) + { + int nCount = GetMenuBar()->GetMenuCount(); + for (int n = 0; n < nCount; n++) + { + if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu) + { + menu = GetMenuBar()->GetMenu(n); + break; + } + } + } + + wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu); + event.SetEventObject(this); + + return HandleWindowEvent(event); } +#endif // wxUSE_MENUS + // --------------------------------------------------------------------------- // the window proc for wxFrame // --------------------------------------------------------------------------- @@ -1037,11 +1092,12 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara processed = HandlePaint(); break; +#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) +#if wxUSE_MENUS case WM_INITMENUPOPUP: processed = HandleInitMenuPopup((WXHMENU) wParam); break; -#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) case WM_MENUSELECT: { WXWORD item, flags; @@ -1055,13 +1111,14 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara case WM_EXITMENULOOP: processed = HandleMenuLoop(wxEVT_MENU_CLOSE, (WXWORD)wParam); break; +#endif // wxUSE_MENUS case WM_QUERYDRAGICON: { const wxIcon& icon = GetIcon(); HICON hIcon = icon.Ok() ? GetHiconOf(icon) : (HICON)GetDefaultIcon(); - rc = (long)hIcon; + rc = (WXLRESULT)hIcon; processed = rc != 0; } break; @@ -1074,29 +1131,6 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara return rc; } -// handle WM_INITMENUPOPUP message -bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu) -{ - wxMenu* menu = NULL; - if (GetMenuBar()) - { - int nCount = GetMenuBar()->GetMenuCount(); - for (int n = 0; n < nCount; n++) - { - if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu) - { - menu = GetMenuBar()->GetMenu(n); - break; - } - } - } - - wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu); - event.SetEventObject(this); - - return GetEventHandler()->ProcessEvent(event); -} - // ---------------------------------------------------------------------------- // wxFrame size management: we exclude the areas taken by menu/status/toolbars // from the client area, so the client area is what's really available for the @@ -1110,19 +1144,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 if( ( toolbar->GetWindowStyleFlag() & wxTB_TOP ) ) + else if ( toolbar->HasFlag(wxTB_LEFT) ) { - pt.y += h; + pt.x += sizeTB.x; } } #endif // wxUSE_TOOLBAR