windows - 如何为工具栏上的按钮启用自动工具提示?

标签 windows winapi tooltip toolbar

如上所述here ,如果我不设置 BTNS_SHOWTEXT按钮的样式,不会显示在按钮文本上,但是当鼠标悬停在按钮上时,您将看到带有文本的工具提示。

所以我不明白为什么此代码示例文本显示在按钮上,而不显示工具提示?

#include <windows.h> 
#include <stdlib.h>
#include <CommCtrl.h>
#pragma comment(lib, "comctl32.lib")

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE instance;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    instance = hInstance;

    WNDCLASSEX wcex; 

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style           = CS_HREDRAW | CS_VREDRAW; 
    wcex.lpfnWndProc    = WndProc; 
    wcex.cbClsExtra     = 0; 
    wcex.cbWndExtra     = 0;  
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));  
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1); 
    wcex.lpszMenuName   = NULL; 
    wcex.lpszClassName  = L"Example"; 
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindow(L"Example", L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        500, 500, NULL, NULL, hInstance, NULL);

    // Initialize common controls.
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC   = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
    InitCommonControlsEx(&icex);

    // create toolbar
    HWND hWndToolbar = CreateWindowEx(0 , TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_TOOLTIPS,
            0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL);

    HIMAGELIST hImageList = ImageList_Create(16, 16, ILC_COLOR16 | ILC_MASK, 3, 0);

    SendMessage(hWndToolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList);
    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

    TBBUTTON tbb[1] = 
    {
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0, (INT_PTR)L"New" },
    };

    SendMessage(hWndToolbar, (UINT) TB_ADDBUTTONS, 1, (LPARAM)&tbb);

    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar , SW_SHOW);

    // show the main window
    ShowWindow(hWnd, nCmdShow);

    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);  
        DispatchMessage(&msg); 
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE: 
            return 0;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
}

最佳答案

引用您链接的 MSDN 文章:

Version 5.81. Specifies that button text should be displayed. All buttons can have text, but only those buttons with the BTNS_SHOWTEXT button style will display it. This button style must be used with the TBSTYLE_LIST style and the TBSTYLE_EX_MIXEDBUTTONS extended style.

此处列出了三个要求。让我们一一解决它们。

  • 版本 5.81

这是通用控件的一个版本,需要在可执行文件中包含 list 。如果缺少,那么您将从 c:\windows\system32 获取旧版本 v4.70。它对 BTNS_SHOWTEXT 一无所知。指定 list 条目的最简单方法是在代码中插入带有 #pragma 的/MANIFESTDEPENDENCY 链接器选项。使其看起来与此类似:

#include <CommCtrl.h>
#pragma comment(lib, "comctl32.lib")
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

添加最后一行。如果您还没有这样做,那么应该立即可见,按钮的突出显示现在显示渐变。窗口的其他部分也将同样获得视觉样式主题。

  • 必须与 TBSTYLE_LIST 样式一起使用

这需要更改您的 CreateWindowEx 调用,包括该样式位:

// create toolbar
HWND hWndToolbar = CreateWindowEx(0 , TOOLBARCLASSNAME, NULL,
     WS_CHILD | TBSTYLE_TOOLTIPS | TBSTYLE_LIST,
     0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL);
  • 和 TBSTYLE_EX_MIXEDBUTTONS 扩展样式

这需要使用 TB_SETEXTENDEDSTYLE 消息来打开扩展样式位:

SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
SendMessage(hWndToolbar, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_MIXEDBUTTONS);
ShowWindow(hWndToolbar , SW_SHOW);

添加了第二行。现在,当您将鼠标悬停在工具栏按钮上时,您将看到预期的工具提示。您仍然需要做一些事情来使按钮实际上对用户可见,但现在它没有显着的功能。位图是常用的方法。

关于windows - 如何为工具栏上的按钮启用自动工具提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16717291/

相关文章:

windows - 如何确定应用程序正在使用的窗口句柄数?

jquery - (jQuery Highchart) 有没有办法将额外的自定义数据放入工具提示框中?

javascript - D3tip 和堆积条形图

c++ - Windows 10 桌面窗口管理器交换时间?

c++ - 显式调用 WINAPI ReadFile()

linux - 通过 Wine 在 Linux 上运行基于 COM/DCOM 的应用程序

c++ - CreateFileMapping MapViewOfFile

javascript - html-/样式化-谷歌地图 api v3 中的工具提示

c++ - 如何在 C++/WinAPI 中通过网络适配器获取发送/接收的字节数

windows - 我不小心将我的 git 编辑器设置为 Atom,如何将其恢复为 Git Bash?