Avoid generating wxEVT_MENU_OPEN and CLOSE for disabled menus in wxMSW.

Check if a top level menu is disabled and consume WM_[UN]INITMENUPOPUP that
Windows still generates for it when it's clicked for some reason.

Closes #2168.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@77657 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-09-10 16:51:33 +00:00
parent c5f557cd3a
commit 6ea435350e

View File

@@ -990,6 +990,47 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara
}
break;
#endif // !__WXMICROWIN__
#if wxUSE_MENUS
case WM_INITMENUPOPUP:
{
wxMenuBar* const bar = GetMenuBar();
if ( bar && !bar->IsEnabledTop(LOWORD(lParam)) )
{
// Skip sending of wxEVT_MENU_OPEN in the base class
// MSWWindowProc() for disabled top level menus.
return MSWDefWindowProc(message, wParam, lParam);
}
}
break;
case WM_UNINITMENUPOPUP:
{
wxMenuBar* const bar = GetMenuBar();
if ( !bar )
break;
// Unlike in WM_INITMENUPOPUP above, we don't have the position
// of the menu in the message itself, so find it ourselves.
const HMENU hmenu = (HMENU)wParam;
const size_t count = bar->GetMenuCount();
for ( size_t n = 0; n < count; n++ )
{
wxMenu* const menu = bar->GetMenu(n);
if ( GetHmenuOf(menu) == hmenu )
{
if ( !bar->IsEnabledTop(n) )
{
// If we skipped sending wxEVT_MENU_OPEN, don't
// send wxEVT_MENU_CLOSE neither.
return MSWDefWindowProc(message, wParam, lParam);
}
}
}
}
break;
#endif // wxUSE_MENUS
}
#if wxUSE_TASKBARBUTTON
if ( message == wxMsgTaskbarButtonCreated )