是否有必要销毁工具提示?

时间:2011-01-31 12:22:51

标签: c++ winapi tooltip destroy

在我的应用程序中,我处理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;
}

移动鼠标指针后,工具提示就会消失。

我的问题是:

  1. 工具提示是否被破坏或者只是隐藏了?
  2. 如果它被隐藏了,那么如何销毁它以及什么时候?
  3. 感谢。

3 个答案:

答案 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资源)。两个窗口同时存在父子关系 - 但是我的系统在运行时更改了这个并且可能是罪魁祸首。如果你的系统概括它,可能没有什么害处。