C++ 按钮的工具提示
我使用MSDN中的函数 然后在C++ 按钮的工具提示,c++,winapi,C++,Winapi,我使用MSDN中的函数 然后在WndProcWM_CREATEI CREATE buttonbutton=CreateWindowEx中( 0, L“按钮”, L“我的按钮”, WS|u可见| WS|u儿童, 10, 10, 100, 24, hWnd, (Humanu)ID_工具提示, 欣斯特, 无效) 最终创建工具提示tooltip\u mess=CreateToolTip(ID\u tooltip,hInst,hWnd,(PTSTR)“工具提示消息”)但它不起作用,我看不到我的工具提示,
WndProc
WM_CREATE
I CREATE buttonbutton=CreateWindowEx中(
0,
L“按钮”,
L“我的按钮”,
WS|u可见| WS|u儿童,
10, 10, 100, 24,
hWnd,
(Humanu)ID_工具提示,
欣斯特,
无效)代码>
最终创建工具提示tooltip\u mess=CreateToolTip(ID\u tooltip,hInst,hWnd,(PTSTR)“工具提示消息”)代码>
但它不起作用,我看不到我的工具提示,我哪里做错了?试试这个:
HWND CreateToolTip(int toolID, HWND hDlg, HINSTANCE hInst, PTSTR pszText)
{
if (!toolID || !hDlg || !pszText)
{
return NULL;
}
// Get the window of the tool.
HWND hwndTool = GetDlgItem(hDlg, toolID);
if (!hwndTool)
{
return NULL;
}
// Create the tooltip. g_hInst is the global instance handle.
HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
WS_POPUP |TTS_ALWAYSTIP | TTS_BALLOON,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
hDlg, NULL,
hInst, NULL);
if (!hwndTip)
{
return NULL;
}
// Associate the tooltip with the tool.
TOOLINFO toolInfo = { 0 };
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = hDlg;
toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
toolInfo.uId = (UINT_PTR)hwndTool;
toolInfo.lpszText = pszText;
if (!SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo))
{
DestroyWindow(hwndTip);
return NULL;
}
return hwndTip;
}
您是否通过发送TTM\u ACTIVATE
message来激活工具提示?SendMessage(工具提示,TTM\u ACTIVATE,TRUE,0);但同样的结果不要将工具提示文本强制转换为PTSTR,而是使用文本宏(即文本(“工具提示消息”)。注意,如果愿意,也可以使用_t宏。有关详细信息,请参阅。您使用的代码与MSDN文章中显示的代码不完全相同。是否检查CreateToolTip()
返回NULL?TTM\u ADDTOOL
返回它是否成功,因此您应该更新CreateToolTip()
以检查它,并让它销毁工具提示,如果TTM\u ADDTOOL
失败,则返回NULL。(PTSTR)“工具提示消息”
是错误的,考虑到您在CreateWindowEx()上使用了L“按钮”)
,这意味着必须定义UNICODE
,因此需要使用L“工具提示消息”(或文本(“工具提示消息”)
)相反。您正在将char*
键入wchar\u t*
,这是错误的。如果使用文本宏解决问题,请在发送TTM\u ADDTOOL消息时检查返回值。您也在检查CreateToolTip的返回值吗?尝试了此代码,但写入了tooltip\u mess=CreateToolTip(ID\u tooltip,hInst,hWnd,L“工具提示消息”);没有hInst,if is right函数只接收3个参数。不幸的是,我看不到工具提示。哪里需要写“if”?我更新了我的答案。至于if
语句,当你需要在按钮上显示/隐藏tooptip时,你可以将它们放在任何需要的地方。if(!SendMessage(hwndTip,TTM\u ADDTOOL,0,(LPARAM)&toolInfo)总是破坏窗口这是正常的吗?我想做一些类似于工具栏的事情,当鼠标在按钮->上显示工具提示时。我尝试在单击按钮时显示工具提示,但得到错误消息“变量'tooltip\u mess'正在使用而没有初始化。“TTM\u ADDTOOL
如果成功则返回TRUE,否则返回FALSE,因此您的工具提示显然没有正确添加到按钮中。至于初始化错误,听起来好像您没有正确管理tooltip\u mess
变量。请提供一个示例来演示您真正在做什么。
HWND CreateToolTip(int toolID, HWND hDlg, HINSTANCE hInst, PTSTR pszText)
{
if (!toolID || !hDlg || !pszText)
{
return NULL;
}
// Get the window of the tool.
HWND hwndTool = GetDlgItem(hDlg, toolID);
if (!hwndTool)
{
return NULL;
}
// Create the tooltip. g_hInst is the global instance handle.
HWND hwndTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
WS_POPUP |TTS_ALWAYSTIP | TTS_BALLOON,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
hDlg, NULL,
hInst, NULL);
if (!hwndTip)
{
return NULL;
}
// Associate the tooltip with the tool.
TOOLINFO toolInfo = { 0 };
toolInfo.cbSize = sizeof(toolInfo);
toolInfo.hwnd = hDlg;
toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
toolInfo.uId = (UINT_PTR)hwndTool;
toolInfo.lpszText = pszText;
if (!SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo))
{
DestroyWindow(hwndTip);
return NULL;
}
return hwndTip;
}
case WM_CREATE:
{
Button = CreateWindowEx( 0, L"BUTTON", L"My Button", WS_VISIBLE|WS_CHILD, 10, 10, 100, 24, hWnd, (HMENU)ID_TOOLTIP, hInst, NULL);
tooltip_mess = CreateToolTip(ID_TOOLTIP, hWnd, hInst, L"Tooltip message");
break;
}
if (tooltip_mess)
SendMessage(tooltip_mess, TTM_ACTIVATE, TRUE, 0);
if (tooltip_mess)
SendMessage(tooltip_mess, TTM_ACTIVATE, FALSE, 0);