X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3882e74621cd5833fddb432fe014bea66c16ee28..94d0d21a15fa73ac426480d195d16ee04caf2de8:/src/msw/frame.cpp?ds=sidebyside diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index c93bb168a1..3e4ff854b7 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -316,7 +316,7 @@ void wxFrame::SendSizeEvent() { RECT r = wxGetWindowRect(GetHwnd()); - (void)::PostMessage(GetHwnd(), WM_SIZE, + (void)::SendMessage(GetHwnd(), WM_SIZE, IsMaximized() ? SIZE_MAXIMIZED : SIZE_RESTORED, MAKELPARAM(r.right - r.left, r.bottom - r.top)); } @@ -357,9 +357,32 @@ void wxFrame::PositionStatusBar() 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 @@ -375,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 { @@ -384,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); } @@ -474,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 @@ -540,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; @@ -561,6 +585,7 @@ bool wxFrame::ShowFullScreen(bool show, long style) ::SetMenu(GetHwnd(), (HMENU)menu); } } +#endif // wxUSE_MENUS #if wxUSE_STATUSBAR wxStatusBar *theStatusBar = GetStatusBar(); @@ -600,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; @@ -627,6 +649,7 @@ void wxFrame::PositionToolBar() toolbar->GetPosition( &tx, &ty ); toolbar->GetSize( &tw, &th ); + int x = 0, y = 0; if ( toolbar->HasFlag(wxTB_BOTTOM) ) { x = 0; @@ -719,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 @@ -812,58 +835,6 @@ bool wxFrame::MSWDoTranslateMessage(wxFrame *frame, WXMSG *pMsg) // our private (non virtual) message handlers // --------------------------------------------------------------------------- -bool wxFrame::HandlePaint() -{ - RECT rect; - if ( ::GetUpdateRect(GetHwnd(), &rect, FALSE) ) - { -#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) - if ( m_iconized ) - { - const wxIcon& icon = GetIcon(); - HICON hIcon = icon.Ok() ? GetHiconOf(icon) - : (HICON)GetDefaultIcon(); - - // Hold a pointer to the dc so long as the OnPaint() message - // is being processed - PAINTSTRUCT ps; - HDC hdc = ::BeginPaint(GetHwnd(), &ps); - - // Erase background before painting or we get white background - MSWDefWindowProc(WM_ICONERASEBKGND, (WORD)(LONG)ps.hdc, 0L); - - if ( hIcon ) - { - RECT rect; - ::GetClientRect(GetHwnd(), &rect); - - // FIXME: why hardcoded? - static const int icon_width = 32; - static const int icon_height = 32; - - int icon_x = (int)((rect.right - icon_width)/2); - int icon_y = (int)((rect.bottom - icon_height)/2); - - ::DrawIcon(hdc, icon_x, icon_y, hIcon); - } - - ::EndPaint(GetHwnd(), &ps); - - return true; - } - else - #endif - { - return wxWindow::HandlePaint(); - } - } - else - { - // nothing to paint - processed - return true; - } -} - bool wxFrame::HandleSize(int WXUNUSED(x), int WXUNUSED(y), WXUINT id) { #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) @@ -923,46 +894,35 @@ 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) { - if ( control ) - { - // In case it's e.g. a toolbar. - wxWindow *win = wxFindWinFromHandle(control); - if ( win ) - return win->MSWCommand(cmd, id); - } - - // handle here commands from menus and accelerators - if ( cmd == 0 || cmd == 1 ) + // we only need to handle the menu and accelerator commands from the items + // of our menu bar, base wxWindow class already handles the rest + if ( !control && (cmd == 0 /* menu */ || cmd == 1 /* accel */) ) { #if wxUSE_MENUS_NATIVE - if ( wxCurrentPopupMenu ) - { - wxMenu *popupMenu = wxCurrentPopupMenu; - wxCurrentPopupMenu = NULL; - - return popupMenu->MSWCommand(cmd, id); - } + if ( !wxCurrentPopupMenu ) #endif // wxUSE_MENUS_NATIVE - -#if defined(__SMARTPHONE__) && defined(__WXWINCE__) - // handle here commands from Smartphone menu bar - if ( wxTopLevelWindow::HandleCommand(id, cmd, control ) ) { - return true; - } -#endif // __SMARTPHONE__ && __WXWINCE__ + wxMenuBar * const mbar = GetMenuBar(); + if ( mbar ) + { + // sign extend to int from short before comparing with the + // other int ids + const int id = (signed short)id_; - if ( ProcessCommand(id) ) - { - return true; + wxMenuItem * const mitem = mbar->FindItem(id); + if ( mitem ) + return ProcessCommand(mitem); + } } } - return false; + return wxFrameBase::HandleCommand(id_, cmd, control);; } +#if wxUSE_MENUS + bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) { int item; @@ -983,7 +943,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; } @@ -991,7 +951,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) @@ -1001,9 +961,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 // --------------------------------------------------------------------------- @@ -1032,19 +1016,23 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara UnpackCommand((WXWPARAM)wParam, (WXLPARAM)lParam, &id, &hwnd, &cmd); - processed = HandleCommand(id, cmd, (WXHWND)hwnd); - } - break; + HandleCommand(id, cmd, (WXHWND)hwnd); - case WM_PAINT: - processed = HandlePaint(); + // don't pass WM_COMMAND to the base class whether we processed + // it or not because we did generate an event for it (our + // HandleCommand() calls the base class version) and we must + // not do it again or the handlers which skip the event would + // be called twice + processed = true; + } 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; @@ -1058,13 +1046,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; @@ -1077,29 +1066,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