Реализация подсказок отслеживания

Подсказки отслеживания остаются видимыми, пока они не будут явно закрыты приложением, и могут динамически изменять положение на экране. Они поддерживаются 4.70 и более поздними общими элементами управления.

Чтобы создать подсказку отслеживания, добавьте флаг TTF_TRACK в элемент uFlags структуры TOOLINFO при отправке сообщения TTM_ADDTOOL.

Приложение должно вручную активировать (показать) и отключить (скрыть) подсказку отслеживания, отправив сообщение TTM_TRACKACTIVATE . Хотя подсказка отслеживания активна, приложение должно указать расположение подсказки, отправив TTM_TRACKPOSITION сообщения в элемент управления подсказки. Так как приложение обрабатывает такие задачи, как размещение подсказки, подсказки отслеживания не используют флаг TTF_SUBCLASS или сообщение TTM_RELAYEVENT .

Сообщение TTM_TRACKPOSITION приводит к отображению окна с помощью одного из двух стилей размещения:

  • По умолчанию подсказка отображается рядом с соответствующим инструментом в позиции, выбранной элементом управления. Выбранное расположение относительно координат, которые вы предоставляете с помощью этого сообщения.
  • Если включить значение TTF_ABSOLUTE в элемент структуры TOOLINFO, подсказка отображается в расположении пикселя, указанном в сообщении. В этом случае элемент управления не пытается изменить расположение окна подсказки с указанных координат.

Это важно знать

Технологии

Необходимые компоненты

  • C/C++
  • Программирование пользовательского интерфейса Windows

Instructions

Реализация подсказок на месте

Элемент uFlags структуры TOOLINFO, используемой в примере, включает флаг TTF_ABSOLUTE. Без этого флага элемент управления подсказки выбирает место отображения подсказки и его положение относительно диалогового окна может внезапно измениться при перемещении указателя мыши.

Примечание.

g_toolItem — это глобальная структура TOOLINFO .

 

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

HWND CreateTrackingToolTip(int toolID, HWND hDlg, WCHAR* pText)
{
    // Create a tooltip.
    HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, 
                                 WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, 
                                 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
                                 hDlg, NULL, g_hInst,NULL);

    if (!hwndTT)
    {
      return NULL;
    }

    // Set up the tool information. In this case, the "tool" is the entire parent window.
    
    g_toolItem.cbSize   = sizeof(TOOLINFO);
    g_toolItem.uFlags   = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
    g_toolItem.hwnd     = hDlg;
    g_toolItem.hinst    = g_hInst;
    g_toolItem.lpszText = pText;
    g_toolItem.uId      = (UINT_PTR)hDlg;
    
    GetClientRect (hDlg, &g_toolItem.rect);

    // Associate the tooltip with the tool window.
    
    SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &g_toolItem); 
    
    return hwndTT;
}
            

Реализация процедуры окна

Если указатель мыши находится в клиентской области, подсказка активна и отображает координаты курсора, как показано на следующем рисунке.

screen shot of a dialog box; a tooltip shows the x and y coordinates of the mouse pointer

В следующем примере кода используется процедура окна для диалогового окна, отображающего подсказку отслеживания, созданную в предыдущем примере. Глобальная логическая переменная g_TrackingMouse используется для определения необходимости повторной активации подсказки и сброса отслеживания мыши, чтобы приложение уведомлялось, когда указатель мыши покидает клиентская область диалогового окна.

//g_hwndTrackingTT is a global HWND variable

case WM_INITDIALOG:

        InitCommonControls();
        g_hwndTrackingTT = CreateTrackingToolTip(IDC_BUTTON1, hDlg, L"");
        return TRUE;

case WM_MOUSELEAVE: // The mouse pointer has left our window. Deactivate the tooltip.
    
    SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)&g_toolItem);
    g_TrackingMouse = FALSE;
    return FALSE;

case WM_MOUSEMOVE:

    static int oldX, oldY;
    int newX, newY;

    if (!g_TrackingMouse)   // The mouse has just entered the window.
    {                       // Request notification when the mouse leaves.
    
        TRACKMOUSEEVENT tme = { sizeof(TRACKMOUSEEVENT) };
        tme.hwndTrack       = hDlg;
        tme.dwFlags         = TME_LEAVE;
        
        TrackMouseEvent(&tme);

        // Activate the tooltip.
        SendMessage(g_hwndTrackingTT, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)&g_toolItem);
        
        g_TrackingMouse = TRUE;
    }

    newX = GET_X_LPARAM(lParam);
    newY = GET_Y_LPARAM(lParam);

    // Make sure the mouse has actually moved. The presence of the tooltip 
    // causes Windows to send the message continuously.
    
    if ((newX != oldX) || (newY != oldY))
    {
        oldX = newX;
        oldY = newY;
            
        // Update the text.
        WCHAR coords[12];
        swprintf_s(coords, ARRAYSIZE(coords), L"%d, %d", newX, newY);
        
        g_toolItem.lpszText = coords;
        SendMessage(g_hwndTrackingTT, TTM_SETTOOLINFO, 0, (LPARAM)&g_toolItem);

        // Position the tooltip. The coordinates are adjusted so that the tooltip does not overlap the mouse pointer.
        
        POINT pt = { newX, newY }; 
        ClientToScreen(hDlg, &pt);
        SendMessage(g_hwndTrackingTT, TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(pt.x + 10, pt.y - 20));
    }
    return FALSE;

Использование элементов управления подсказками