6

在我的应用程序中,我正在处理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. 如果它是隐藏的,那么如何销毁它以及何时销毁?

谢谢。

4

3 回答 3

4

自从我完成任何 WinAPI 编程以来已经有一段时间了,但如果我没记错的话......

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

从有关该DestroyWindow功能的 MSDN 文档中,它说:

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

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

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

在您对 vz0 的回答的评论中,您说:

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

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

于 2011-02-01T12:15:40.650 回答
2

对于每个CreateWindowEx调用,您都需要一个匹配的DestroyWindow调用。

作为一种替代方法,您可以使用ShowWindow调用来显示SW_SHOWSW_HIDE隐藏弹出窗口,而不是每次都创建和销毁窗口。

于 2011-01-31T13:37:10.330 回答
0

根据我的经验,我必须DestroyWindow()在工具提示上HFONT才能正确发布(字体 GDI 资源)。一次有两个窗口的父子关系 - 但我的系统在运行时改变了这一点,可能是罪魁祸首。如果您的系统概括它,这样做可能没有害处。

于 2018-01-11T04:39:27.023 回答