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

Fav*_*ius 5 c++ winapi tooltip destroy

在我的应用程序中,我正在处理WM_HELP消息,然后使用此方法为控件创建工具提示:

摘自:http : //msdn.microsoft.com/zh-cn/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;
}
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

  1. 工具提示被破坏还是只是隐藏?
  2. 如果它是隐藏的,那么如何销毁它?何时销毁?

谢谢。

Ton*_*ony 6

我已经有一段时间没有进行任何 WinAPI 编程了,但如果我没记错的话......

调用将作为hWndParentCreateWindowEx参数传递,这意味着对话框窗口现在是工具提示的父窗口。hDlg

从 MSDN 文档中关于DestroyWindow该函数的内容可以看出:

如果指定的窗口是父窗口或所有者窗口,则 DestroyWindow 在销毁父窗口或所有者窗口时会自动销毁关联的子窗口或所属窗口。该函数首先销毁子窗口或拥有的窗口,然后销毁父窗口或所有者窗口。

因此,您可以假设您的工具提示窗口最终将被销毁。如果您调用CreateToolTip以响应每条WM_HELP消息,请小心,因为您最终会在内存中保留许多工具提示窗口,直到您的对话框关闭并DestroyWindow最终被调用。

正如 vz0 指出的,您可以创建一次工具提示,挂在窗口句柄上,然后显示工具提示以响应帮助消息,而不是再次创建它。

在您对 vz0 答案的评论中您说:

工具提示消失的方式有多种。例如:鼠标移动、超时等。

所有这些只会导致窗口被隐藏,因此工具提示的句柄仍然有效并且可以使用重新显示ShowWindow