Какой смысл передавать два дескриптора HWND при выполнении TTM_ADDTOOL объекту всплывающей подсказки?

В этом примере кода 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, один - диалоговое окно (hDlg), другой - элемент управления внутри диалогового окна. Я попытался и обнаружил, что комментируя toolInfo.hwnd = hDlg; может показывать всплывающую подсказку при наведении мыши на элемент управления toolID.

Тогда какой смысл передавать две ручки HWND? Это необходимо или полезно в других случаях?

2 ответа

Решение

Hwnd в структуре TOOLINFO также используется, когда для поля lpszText установлено значение LPSTR_TEXTCALLBACK. Когда всплывающей подсказке понадобится текст, она отправит уведомление TTN_GETDISPINFO через сообщение WM_NOTIFY этому hwnd. LPARAM этого сообщения будет тогда указателем на структуру NMTTDISPINFO, которую вы затем сможете использовать для установки текста подсказки. Хорошо, если текст подсказки нужно изменить.

В дополнение к причине, объясненной в принятом ответе, при информировании hwnd член rect использует клиентскую область окна за этим дескриптором в качестве основы для своих координат.

Когда hwnd не используется или указывает на недопустимый дескриптор, член rect относится к экрану, что может привести к неожиданному поведению. Таким образом, если вы не хотите делать что-то очень конкретное, учитывающее рабочий стол, всякий раз, когда вы хотите использовать rect, вам нужно указать допустимый дескриптор в hwnd.

Я нигде не нашел этого объяснения. Мое наблюдение за использованием этого дескриптора и члена rect помогло мне понять, что они связаны таким образом.

Другие вопросы по тегам