Fix HMENU to wxMenu translation in wxMSW code.

We didn't find the menus corresponding to the submenu handles. This resulted
in incorrect processing of EVT_UPDATE_UI events for the submenus and probably
other problems.

Fix this by searching for the HMENU recursively in all menus.

Closes #13080.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67355 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-03-31 09:28:38 +00:00
parent 40cb56e248
commit a99a3029c8
4 changed files with 50 additions and 9 deletions

View File

@@ -516,6 +516,7 @@ MSW:
- Fix wxBitmapButton best size determination broken in 2.9.1. - Fix wxBitmapButton best size determination broken in 2.9.1.
- Center task dialog-based wxProgressDialog on the parent (John Roberts). - Center task dialog-based wxProgressDialog on the parent (John Roberts).
- wxAutomationObject::GetInstance() creates objects on demand (Kolya Kosenko). - wxAutomationObject::GetInstance() creates objects on demand (Kolya Kosenko).
- Fix EVT_UPDATE_UI generation for items in submenus (wsu).
OSX: OSX:

View File

@@ -102,6 +102,9 @@ public:
m_maxAccelWidth = -1; m_maxAccelWidth = -1;
} }
// get the menu with given handle (recursively)
wxMenu* MSWGetMenu(WXHMENU hMenu);
private: private:
void CalculateMaxAccelWidth(); void CalculateMaxAccelWidth();
@@ -208,6 +211,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 the menu with given handle (recursively)
wxMenu* MSWGetMenu(WXHMENU hMenu);
protected: protected:
// common part of all ctors // common part of all ctors
void Init(); void Init();

View File

@@ -864,15 +864,7 @@ bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu)
wxMenu* menu = NULL; wxMenu* menu = NULL;
if (GetMenuBar()) if (GetMenuBar())
{ {
int nCount = GetMenuBar()->GetMenuCount(); menu = GetMenuBar()->MSWGetMenu(hMenu);
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); wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu);

View File

@@ -885,6 +885,30 @@ bool wxMenu::MSWCommand(WXUINT WXUNUSED(param), WXWORD id_)
return true; return true;
} }
// get the menu with given handle (recursively)
wxMenu* wxMenu::MSWGetMenu(WXHMENU hMenu)
{
// check self
if ( GetHMenu() == hMenu )
return this;
// recursively query submenus
for ( size_t n = 0 ; n < GetMenuItemCount(); ++n )
{
wxMenuItem* item = FindItemByPosition(n);
wxMenu* submenu = item->GetSubMenu();
if ( submenu )
{
submenu = submenu->MSWGetMenu(hMenu);
if (submenu)
return submenu;
}
}
// unknown hMenu
return NULL;
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Menu Bar // Menu Bar
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -1467,4 +1491,22 @@ void wxMenuBar::Detach()
wxMenuBarBase::Detach(); wxMenuBarBase::Detach();
} }
// get the menu with given handle (recursively)
wxMenu* wxMenuBar::MSWGetMenu(WXHMENU hMenu)
{
wxCHECK_MSG( GetHMenu() != hMenu, NULL,
wxT("wxMenuBar::MSWGetMenu(): menu handle is wxMenuBar, not wxMenu") );
// query all menus
for ( size_t n = 0 ; n < GetMenuCount(); ++n )
{
wxMenu* menu = GetMenu(n)->MSWGetMenu(hMenu);
if ( menu )
return menu;
}
// unknown hMenu
return NULL;
}
#endif // wxUSE_MENUS #endif // wxUSE_MENUS