如上所述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/