2015-11-14 5 views
-1

В this MSDN Пример кода:В чем смысл прохождения двух HWND-ручек при выполнении TTM_ADDTOOL в объект всплывающей подсказки?

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

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

+0

Вы фактически не использовали два ручка окна, вы просто указали * id * кончика. Это может быть полезно позже, когда вам нужно динамически генерировать текст всплывающей подсказки. Вы получаете флаг и идентификатор обратно в уведомлениях TTN_GETDISPINFO и TTN_NEEDTEXT. –

+0

@ HansPassant: «Идентификатор» действительно является * HWND * при использовании флага 'TTF_IDISHWND' (что делает этот код). – IInspectable

+0

Несомненно. Уведомление также передает флаг, чтобы обработчик сообщения знал, что он имеет действительный дескриптор окна. В операционной системе все равно, какой идентификатор вы используете. –

ответ

2

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

+0

Вы правы, а страница MSDN (https://msdn.microsoft.com/en-us/library/windows/desktop/bb760250 (v = vs.85) .aspx) указывает на это явно и немного неопределенно. Я прочитал его три раза, чтобы получить эту идею. Таким образом, один HWND должен идентифицировать горячую область (называемую «инструментом»), другой HWND используется как средство обратного вызова для уведомления - в случае, если вы хотите это уведомление. –