我正在寻找一种解决方案来显示 WinAPI 程序中单个菜单项的工具提示。
ID_MAIN_MENU MENU
BEGIN
...
END
MENUITEM "?", ID_RIGHT_BUTTON, HELP
END
我能够add tooltip for a control具有 TOOLINFO
结构和 TTM_ADDTOOL
消息,但这似乎不适用于 HMENU
句柄。
我找到了some C++ libraries向菜单项添加工具提示,但我使用的是 C。
此外,这里无法使用 WM_MENUSELECT
消息,该消息仅在单击菜单时发送,而不是悬停在菜单上。
如有任何建议,我们将不胜感激。
最佳答案
最终找到一个足够好的解决方案,使工具提示在鼠标悬停时出现并在鼠标移出时消失(并不完美,因为没有初始延迟时间或自动弹出延迟时间)。
#define _WIN32_IE 0x0300 // to reach TTM_TRACKACTIVATE in <commctrl.h>
#include <windows.h>
#include <commctrl.h>
HWND hToolTip;
TOOLINFO ti = {0};
// WndProc
case WM_CREATE: {
HMENU hmenu = CreateMenu();
AppendMenu( hmenu, MF_HELP, 123, "?" );
SetMenu( hWnd, hmenu );
hToolTip = CreateWindow( TOOLTIPS_CLASS, 0, WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, hWnd, 0, 0, 0);
ti.cbSize = sizeof(TOOLINFO);
ti.hwnd = hWnd;
ti.uId = (UINT)hToolTip;
ti.lpszText = "My tooltip";
SendMessage( hToolTip, TTM_ADDTOOL, 0, (LPARAM)&ti );
break;
}
case WM_NCMOUSEMOVE: {
RECT rect;
GetMenuItemRect( hWnd, GetMenu(hWnd), 0, &rect );
// ^ zero-based position of the menu item
int x = LOWORD(lParam);
int y = HIWORD(lParam);
if ( x>=rect.left && y>=rect.top && x<rect.right && y<rect.bottom )
SendMessage( hToolTip, TTM_TRACKACTIVATE, TRUE, (LPARAM)&ti );
else
SendMessage( hToolTip, TTM_TRACKACTIVATE, FALSE, (LPARAM)&ti );
break;
}
case WM_MOUSEMOVE:
SendMessage( hToolTip, TTM_TRACKACTIVATE, FALSE, (LPARAM)&ti );
break;
为什么我使用TTM_TRACKACTIVATE
而不是TTM_POPUP
?
- 奇怪的是,MinGW (gcc 5.3.0) 在
commctrl.h
中没有定义TTM_POPUP
。 TTM_POPUP
需要 Visual Styles enabled with manifest .- 最终对我来说
TTM_POPUP
在这种情况下无效。
关于c - 如何向菜单项添加工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41731311/