c - 如何向菜单项添加工具提示

标签 c winapi menu tooltip

我正在寻找一种解决方案来显示 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 消息,该消息仅在单击菜单时发送,而不是悬停在菜单上。

Tooltip on single menu item我想要的假设图像。

如有任何建议,我们将不胜感激。

最佳答案

最终找到一个足够好的解决方案,使工具提示在鼠标悬停时出现并在鼠标移出时消失(并不完美,因为没有初始延迟时间或自动弹出延迟时间)。

#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/

相关文章:

c++ - c/c++中void指针的使用

c++ - 使用 SetTimer 传递用户数据

c++ - GET_WHEEL_DELTA_WPARAM 从不返回负数

c++ - 设置窗口像素的正确(无闪烁)方式?

css - Bootstrap 4 导航栏不工作

php - 将 MYSQL 数据插入与下拉菜单中的字段关联的数据库表

c++ - 如何修复 Sentry 中缺少的 CSRF token

c - 在 while 循环中逐行读取文件,同时另一个函数更新它

javascript - 对相似参数进行分组的逻辑

Android 菜单自定义图标