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

时间:2013-05-23 14:56:26

标签: 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);
    }
}

2 个答案:

答案 0 :(得分:3)

从您关联的MSDN文章中引用:

  

版本5.81。指定应显示按钮文本。所有按钮都可以有文本,但只有那些具有BTNS_SHOWTEXT按钮样式的按钮才会显示它。此按钮样式必须与TBSTYLE_LIST样式和TBSTYLE_EX_MIXEDBUTTONS扩展样式一起使用。

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

  • 版本5.81

这是需要可执行文件中的清单的常见控件的版本。如果它丢失了,那么你将从c:\ windows \ system32获得旧版本v4.70。哪个对BTNS_SHOWTEXT一无所知。指定清单条目的最简单方法是在代码中插入带有#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);

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

答案 1 :(得分:1)

您的代码几乎正确,它只缺少一行:

SendMessage(hWndToolbar, TB_SETMAXTEXTROWS, 0, 0);

您可以将它放在创建工具栏窗口和显示它的位置之间。它只是更多的初始化代码。出于测试目的,我在发送TB_AUTOSIZE消息之前添加了它。

现在它的工作方式如下所示:将鼠标悬停在工具栏按钮上,您会看到包含按钮文本的工具提示。只有一点需要注意:按钮的文本实际上并没有显示在按钮本身中。

如果你仔细想想,那就有意义了。基本上,如果整个字符串已经在按钮本身上可见,那么在工具提示中显示文本是没有意义的。显示自动工具提示的唯一方法是按钮的文本是否适合。通过将文本可用的最大行数设置为0,发送TB_SETMAXTEXTROWS message可确保文本永远不会适合。

MSDN操作方法文章How to Display Tooltips for Buttons中详细介绍了这一点。