Don't generate wxEVT_MENU_{OPEN,CLOSE} for disabled top menus in wxMSW.
Windows still sends these messages even if a top level menu is disabled, for some reason, so filter them out manually. Closes #2168. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78247 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -235,6 +235,9 @@ public:
|
|||||||
void Refresh( bool eraseBackground,
|
void Refresh( bool eraseBackground,
|
||||||
const wxRect *rect = (const wxRect *) NULL ) { wxWindow::Refresh(eraseBackground, rect); }
|
const wxRect *rect = (const wxRect *) NULL ) { wxWindow::Refresh(eraseBackground, rect); }
|
||||||
|
|
||||||
|
// Get a top level menu position or wxNOT_FOUND from its handle.
|
||||||
|
int MSWGetTopMenuPos(WXHMENU hMenu) const;
|
||||||
|
|
||||||
// Get a top level or sub menu with given handle (recursively).
|
// Get a top level or sub menu with given handle (recursively).
|
||||||
wxMenu* MSWGetMenu(WXHMENU hMenu) const;
|
wxMenu* MSWGetMenu(WXHMENU hMenu) const;
|
||||||
|
|
||||||
|
@@ -985,6 +985,22 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_INITMENUPOPUP:
|
||||||
|
case WM_UNINITMENUPOPUP:
|
||||||
|
// We get these messages from the menu bar even if the menu is
|
||||||
|
// disabled, which is unexpected, so ignore them in this case.
|
||||||
|
if ( wxMenuBar* mbar = GetMenuBar() )
|
||||||
|
{
|
||||||
|
const int pos = mbar->MSWGetTopMenuPos((WXHMENU)wParam);
|
||||||
|
if ( pos != wxNOT_FOUND && !mbar->IsEnabledTop(pos) )
|
||||||
|
{
|
||||||
|
// This event comes from a disabled top level menu, don't
|
||||||
|
// handle it.
|
||||||
|
return MSWDefWindowProc(message, wParam, lParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
|
#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
|
||||||
case WM_QUERYDRAGICON:
|
case WM_QUERYDRAGICON:
|
||||||
{
|
{
|
||||||
|
@@ -1629,6 +1629,18 @@ void wxMenuBar::Detach()
|
|||||||
wxMenuBarBase::Detach();
|
wxMenuBarBase::Detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int wxMenuBar::MSWGetTopMenuPos(WXHMENU hMenu) const
|
||||||
|
{
|
||||||
|
for ( size_t n = 0 ; n < GetMenuCount(); ++n )
|
||||||
|
{
|
||||||
|
wxMenu* menu = GetMenu(n)->MSWGetMenu(hMenu);
|
||||||
|
if ( menu )
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return wxNOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
wxMenu* wxMenuBar::MSWGetMenu(WXHMENU hMenu) const
|
wxMenu* wxMenuBar::MSWGetMenu(WXHMENU hMenu) const
|
||||||
{
|
{
|
||||||
// If we're called with the handle of the menu bar itself, we can return
|
// If we're called with the handle of the menu bar itself, we can return
|
||||||
|
Reference in New Issue
Block a user