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:
@@ -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:
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user