mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-09-20 12:59:31 +08:00
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:
+9
-5
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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__)
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
Reference in New Issue
Block a user