diff --git a/include/wx/msw/frame.h b/include/wx/msw/frame.h index 949372cc7e..b3d93819e7 100644 --- a/include/wx/msw/frame.h +++ b/include/wx/msw/frame.h @@ -108,7 +108,7 @@ public: virtual WXHMENU MSWGetActiveMenu() const { return m_hMenu; } virtual bool HandleMenuSelect(WXWORD nItem, WXWORD nFlags, WXHMENU hMenu); - virtual bool DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup); + virtual bool DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu); // Look up the menu in the menu bar. virtual wxMenu* MSWFindMenuFromHMENU(WXHMENU hMenu); diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 3778318000..0a5b7f8712 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -542,7 +542,7 @@ public: bool HandleMenuPopup(wxEventType evtType, WXHMENU hMenu); // Command part of HandleMenuPopup() and HandleExitMenuLoop(). - virtual bool DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup); + virtual bool DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu); // Find the menu corresponding to the given handle. virtual wxMenu* MSWFindMenuFromHMENU(WXHMENU hMenu); diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index c60c93ff16..9b7e456ba0 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -491,10 +491,10 @@ bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) return wxWindow::HandleMenuSelect(nItem, flags, hMenu); } -bool wxFrame::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup) +bool wxFrame::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu) { // Update the menu depth when dealing with the top level menus. - if ( !popup ) + if ( !menu || menu->IsAttached() ) { if ( evtType == wxEVT_MENU_OPEN ) { @@ -512,12 +512,18 @@ bool wxFrame::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool p } } - return wxWindow::DoSendMenuOpenCloseEvent(evtType, menu, popup); + return wxWindow::DoSendMenuOpenCloseEvent(evtType, menu); } wxMenu* wxFrame::MSWFindMenuFromHMENU(WXHMENU hMenu) { - return GetMenuBar() ? GetMenuBar()->MSWGetMenu(hMenu) : NULL; + if ( wxMenuBar* mbar = GetMenuBar() ) + { + if ( wxMenu* menu = mbar->MSWGetMenu(hMenu) ) + return menu; + } + + return wxFrameBase::MSWFindMenuFromHMENU(hMenu); } #endif // wxUSE_MENUS && !defined(__WXUNIVERSAL__) diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 193af0be52..6f2d4b3f15 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -2288,9 +2288,9 @@ wxWindowMSW::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) } bool -wxWindowMSW::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup) +wxWindowMSW::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu) { - wxMenuEvent event(evtType, popup ? wxID_ANY : 0, menu); + wxMenuEvent event(evtType, menu && !menu->IsAttached() ? wxID_ANY : 0, menu); event.SetEventObject(menu); return HandleWindowEvent(event); @@ -2298,25 +2298,16 @@ wxWindowMSW::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool po bool wxWindowMSW::HandleMenuPopup(wxEventType evtType, WXHMENU hMenu) { - bool isPopup = false; - wxMenu* menu = NULL; - if ( wxCurrentPopupMenu && wxCurrentPopupMenu->GetHMenu() == hMenu ) - { - menu = wxCurrentPopupMenu; - isPopup = true; - } - else - { - menu = MSWFindMenuFromHMENU(hMenu); - } + wxMenu* const menu = MSWFindMenuFromHMENU(hMenu); - - return DoSendMenuOpenCloseEvent(evtType, menu, isPopup); + return DoSendMenuOpenCloseEvent(evtType, menu); } -wxMenu* wxWindowMSW::MSWFindMenuFromHMENU(WXHMENU WXUNUSED(hMenu)) +wxMenu* wxWindowMSW::MSWFindMenuFromHMENU(WXHMENU hMenu) { - // We don't have any menus at this level. + if ( wxCurrentPopupMenu && wxCurrentPopupMenu->GetHMenu() == hMenu ) + return wxCurrentPopupMenu; + return NULL; }