正如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);
}
}
答案 0 :(得分:3)
从您关联的MSDN文章中引用:
版本5.81。指定应显示按钮文本。所有按钮都可以有文本,但只有那些具有BTNS_SHOWTEXT按钮样式的按钮才会显示它。此按钮样式必须与TBSTYLE_LIST样式和TBSTYLE_EX_MIXEDBUTTONS扩展样式一起使用。
此处列出了三个要求。让我们一个一个地解决它们。
这是需要可执行文件中的清单的常见控件的版本。如果它丢失了,那么你将从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='*'\"")
添加最后一行。如果您还没有这样做,应该立即可见,按钮的高亮显示现在显示渐变。窗口的其他部分同样会获得视觉样式主题。
这需要更改您的CreateWindowEx调用,包括该样式位:
// create toolbar
HWND hWndToolbar = CreateWindowEx(0 , TOOLBARCLASSNAME, NULL,
WS_CHILD | TBSTYLE_TOOLTIPS | TBSTYLE_LIST,
0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL);
这需要使用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中详细介绍了这一点。