在我的应用程序中,我处理WM_HELP
消息,然后使用此方法为控件创建工具提示:
取自:http://msdn.microsoft.com/en-us/library/bb760252(v=vs.85).aspx
HWND CreateToolTip(int toolID, HWND hDlg, PTSTR pszText)
{
if (!toolID || !hDlg || !pszText)
{
return FALSE;
}
// Get the window of the tool.
HWND hwndTool = GetDlgItem(hDlg, toolID);
// 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,
g_hInst, NULL);
if (!hwndTool || !hwndTip)
{
return (HWND)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;
SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);
return hwndTip;
}
移动鼠标指针后,工具提示就会消失。
我的问题是:
感谢。
答案 0 :(得分:2)
对于每次CreateWindowEx来电,您需要匹配DestroyWindow来电。
作为替代方案,每次您都可以SW_SHOW
使用SW_HIDE
和{{1}}来显示和隐藏弹出窗口,而不是创建和销毁窗口。
答案 1 :(得分:2)
自从我完成任何WinAPI编程以来已经有一段时间了,但如果我的记忆能够为我服务......
对CreateWindowEx
的调用将hDlg
作为 hWndParent 参数传递,这意味着对话框窗口现在是工具提示的父级。
从DestroyWindow
函数的MSDN文档中可以看出:
如果指定的窗口是父窗口或所有者窗口,则DestroyWindow会在销毁父窗口或所有者窗口时自动销毁关联的子窗口或拥有的窗口。该函数首先销毁子窗口或拥有窗口,然后它会破坏父窗口或所有者窗口。
因此,您可以假设您的工具提示窗口将被销毁最终。如果您在响应每条CreateToolTip
消息时调用WM_HELP
,请小心,因为您最终会在内存中挂起一些工具提示窗口,直到对话框关闭并最终调用DestroyWindow
vz0指出你可以创建一次工具提示,挂在窗口句柄上,然后显示工具提示以响应帮助信息,而不是再次创建它。
在您对vz0的回答的评论中,您说:
工具提示有多种方式可供选择。例如:鼠标移动,超时等。
所有这些只会导致窗口被隐藏,因此工具提示的句柄仍然有效,可以使用ShowWindow
重新显示。
答案 2 :(得分:0)
根据我的经验,我必须在工具提示上DestroyWindow()
,以便正确发布HFONT
(字体GDI资源)。两个窗口同时存在父子关系 - 但是我的系统在运行时更改了这个并且可能是罪魁祸首。如果你的系统概括它,可能没有什么害处。