0

MSDN 代码示例中:

// Description:
//   Creates a tooltip for an item in a dialog box. 
// Parameters:
//   idTool - identifier of an dialog box item.
//   nDlg - window handle of the dialog box.
//   pszText - string to use as the tooltip text.
// Returns:
//   The handle to the tooltip.
//
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;                          // first HWND
    toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    toolInfo.uId = (UINT_PTR)hwndTool;             // second HWND
    toolInfo.lpszText = pszText;
    SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo);

    return hwndTip;
}

我们TTM_ADDTOOL将操作与两个 HWND 句柄相关联,一个是 Dialogbox(hDlg),另一个是对话框内的控件。toolInfo.hwnd = hDlg;我试过了,发现当鼠标悬停在 toolID 控件上时,注释掉仍然可以显示工具提示。

那么传递两个 HWND 句柄有什么意义呢?在其他情况下它是必须的还是有用的?

4

2 回答 2

2

当您将lpszText字段设置为 LPSTR_TEXTCALLBACK时,也会使用 TOOLINFO 结构中的hwnd 。当工具提示需要文本时,它将通过 WM_NOTIFY 消息向该hwnd发送TTN_GETDISPINFO通知。然后,该消息的 LPARAM 将成为指向NMTTDISPINFO结构的指针,然后您可以使用该结构设置工具提示的文本。在工具提示的文本需要更改的情况下很好。

于 2015-11-14T14:15:53.183 回答
0

除了在接受的答案中解释的原因之外,当通知 hwnd 时,rect 成员使用此句柄后面的窗口客户区作为其坐标的基础。

当未使用 hwnd 或它指向无效句柄时,rect 成员是屏幕相关的,这可能会导致意外行为。因此,除非您想做一些非常具体的考虑到桌面的事情,否则无论何时要使用 rect,都需要在 hwnd 中提供一个有效的句柄。

我没有在任何地方找到这个解释。我对使用此句柄和 rect 成员的观察使我明白它们以这种方式相关。

于 2022-02-04T13:39:26.077 回答