2

如此处所述,如果我没有将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);
    }
}
4

2 回答 2

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);

加上第二行。现在,当您将鼠标悬停在工具栏按钮上时,您将看到预期的工具提示。您仍然需要做一些事情来使用户真正看到该按钮,目前它没有显着特征。位图是通常的方法。

于 2013-05-27T10:27:54.433 回答
1

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

SendMessage(hWndToolbar, TB_SETMAXTEXTROWS, 0, 0);

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

现在它就像描述的那样工作:将鼠标悬停在工具栏按钮上,您会看到一个包含按钮文本的工具提示。只有一个警告:按钮的文本实际上并未显示在按钮本身中。

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

这在 MSDN 操作方法文章中有更详细的介绍:如何显示按钮的工具提示

于 2013-05-27T09:34:33.860 回答