Merge branch 'dl/fix/missing_help_text_statbar' of https://github.com/mxdamien/wxWidgets

Show help text in status bar when mouse is above submenu-entry in wxMSW.

See #24874.

Closes #24842.
This commit is contained in:
Vadim Zeitlin
2024-10-15 15:09:57 +02:00
4 changed files with 56 additions and 8 deletions
+9 -5
View File
@@ -45,6 +45,7 @@ class WXDLLIMPEXP_FWD_BASE wxEventFilter;
#if wxUSE_GUI
class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_CORE wxMenu;
class WXDLLIMPEXP_FWD_CORE wxMenuItem;
class WXDLLIMPEXP_FWD_CORE wxReadOnlyDC;
class WXDLLIMPEXP_FWD_CORE wxWindow;
class WXDLLIMPEXP_FWD_CORE wxWindowBase;
@@ -2576,12 +2577,12 @@ private:
class WXDLLIMPEXP_CORE wxMenuEvent : public wxEvent
{
public:
wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0, wxMenu* menu = nullptr)
wxMenuEvent(wxEventType type = wxEVT_NULL, int winid = 0, wxMenu* menu = nullptr, wxMenuItem* menuItem = nullptr)
: wxEvent(winid, type)
{ m_menuId = winid; m_menu = menu; }
{ m_menuId = winid; m_menu = menu; m_menuItem = menuItem; }
wxMenuEvent(const wxMenuEvent& event)
: wxEvent(event)
{ m_menuId = event.m_menuId; m_menu = event.m_menu; }
{ m_menuId = event.m_menuId; m_menu = event.m_menu; m_menuItem = event.m_menuItem; }
// only for wxEVT_MENU_HIGHLIGHT
int GetMenuId() const { return m_menuId; }
@@ -2592,11 +2593,14 @@ public:
// only for wxEVT_MENU_OPEN/CLOSE
wxMenu* GetMenu() const { return m_menu; }
wxMenuItem* GetMenuItem() const { return m_menuItem; }
virtual wxEvent *Clone() const override { return new wxMenuEvent(*this); }
private:
int m_menuId;
wxMenu* m_menu;
int m_menuId;
wxMenu* m_menu;
wxMenuItem* m_menuItem;
wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxMenuEvent);
};
+4
View File
@@ -574,6 +574,10 @@ public:
// Find the menu corresponding to the given handle.
virtual wxMenu* MSWFindMenuFromHMENU(WXHMENU hMenu);
// Find the the current menu item using the given handle and the item id
virtual wxMenuItem* MSWFindMenuItemFromHMENU(WXHMENU hMenu, int nItem);
#endif // wxUSE_MENUS && !__WXUNIVERSAL__
// Return the default button for the TLW containing this window or nullptr if
+8 -1
View File
@@ -343,7 +343,14 @@ void wxFrameBase::OnMenuHighlight(wxMenuEvent& event)
{
event.Skip();
(void)ShowMenuHelp(event.GetMenuId());
if ( wxMenuItem* menuItem = event.GetMenuItem() )
{
DoGiveHelp(menuItem->GetHelp(), true);
}
else
{
(void)ShowMenuHelp(event.GetMenuId());
}
}
void wxFrameBase::OnMenuClose(wxMenuEvent& event)
+35 -2
View File
@@ -2524,11 +2524,13 @@ wxWindowMSW::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu)
// the top level menus of the menu bar, which can't be represented using
// any valid identifier in wxMenuEvent so use an otherwise unused value for
// them
if ( flags & (MF_POPUP | MF_SEPARATOR) )
if ( flags & MF_SEPARATOR )
item = wxID_NONE;
wxMenu* menu = MSWFindMenuFromHMENU(hMenu);
wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, item, menu);
wxMenuItem* menuItem = MSWFindMenuItemFromHMENU(hMenu, item);
wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, item, menu, menuItem);
if ( wxMenu::ProcessMenuEvent(menu, event, this) )
return true;
@@ -2577,6 +2579,37 @@ wxMenu* wxWindowMSW::MSWFindMenuFromHMENU(WXHMENU hMenu)
return nullptr;
}
wxMenuItem* wxWindowMSW::MSWFindMenuItemFromHMENU(WXHMENU hMenu, int item)
{
WinStruct<MENUITEMINFO> mii;
mii.fMask = MIIM_ID | MIIM_DATA; // Include MIIM_DATA to access dwItemData
const int count = ::GetMenuItemCount(hMenu);
for ( int i = 0; i < count; i++ )
{
if ( ::GetMenuItemInfo(hMenu, i, TRUE, &mii) )
{
wxMenuItem* menuItem = (wxMenuItem*)mii.dwItemData;
if ( mii.wID == (unsigned int)item && menuItem )
{
return menuItem;
}
// Check for submenus
if ( mii.hSubMenu )
{
wxMenuItem* foundInSubmenu = MSWFindMenuItemFromHMENU(mii.hSubMenu, item);
if ( foundInSubmenu )
{
return foundInSubmenu;
}
}
}
}
return nullptr; // Not found
}
#endif // wxUSE_MENUS && !defined(__WXUNIVERSAL__)
// ===========================================================================