Freigeben über


Implementieren von Nachverfolgungs-QuickInfos

QuickInfos zur Nachverfolgung bleiben sichtbar, bis sie von der Anwendung explizit geschlossen werden, und können die Position auf dem Bildschirm dynamisch ändern. Sie werden von Version 4.70 und höher der allgemeinen Steuerelemente unterstützt.

Um eine Nachverfolgungs-QuickInfo zu erstellen, fügen Sie das TTF_TRACK-Flag in das uFlags-Element der TOOLINFO-Struktur ein, wenn Sie die TTM_ADDTOOL-Nachricht senden.

Ihre Anwendung muss eine Nachverfolgungs-QuickInfo manuell aktivieren (anzeigen) und deaktivieren (ausblenden), indem sie eine TTM_TRACKACTIVATE Nachricht sendet. Während eine Tracking-QuickInfo aktiv ist, muss Ihre Anwendung den Speicherort der QuickInfo angeben, indem sie TTM_TRACKPOSITION Nachrichten an das QuickInfo-Steuerelement sendet. Da die Anwendung Aufgaben wie das Positionieren der QuickInfo verarbeitet, verwenden Nachverfolgungs-QuickInfos nicht das TTF_SUBCLASS-Flag oder die TTM_RELAYEVENT Nachricht.

Die TTM_TRACKPOSITION Meldung bewirkt, dass das QuickInfo-Steuerelement das Fenster mit einem von zwei Platzierungsstilen anzeigt:

  • Standardmäßig wird die QuickInfo neben dem entsprechenden Tool an einer Position angezeigt, die das Steuerelement auswähelt. Der ausgewählte Speicherort ist relativ zu den Koordinaten, die Sie mithilfe dieser Nachricht angeben.
  • Wenn Sie den TTF_ABSOLUTE-Wert in das Element der TOOLINFO-Struktur einschließen, wird die QuickInfo an der in der Nachricht angegebenen Pixelposition angezeigt. In diesem Fall versucht das Steuerelement nicht, die Position des QuickInfofensters von den von Ihnen angegebenen Koordinaten zu ändern.

Wichtige Informationen

Technologien

Voraussetzungen

  • C/C++
  • Programmierung der Windows-Benutzeroberfläche

Anweisungen

Implementieren In-Place QuickInfos

Das uFlags-Element der TOOLINFO-Struktur , das im Beispiel verwendet wird, enthält das flag TTF_ABSOLUTE . Ohne dieses Flag wählt das QuickInfo-Steuerelement aus, wo die QuickInfo angezeigt werden soll, und seine Position relativ zum Dialogfeld kann sich plötzlich ändern, wenn sich der Mauszeiger bewegt.

Hinweis

g_toolItem ist eine globale TOOLINFO-Struktur .

 

Im folgenden Beispiel wird veranschaulicht, wie Sie ein QuickInfo-Steuerelement für die Nachverfolgung erstellen. Im Beispiel wird der gesamte Clientbereich des Standard Fensters als Tool angegeben.

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;
}
            

Fensterprozedurimplementierung

Wenn sich der Mauszeiger im Clientbereich befindet, ist die QuickInfo aktiv und zeigt die Cursorkoordinaten an, wie in der folgenden Abbildung dargestellt.

Screenshot eines Dialogfelds; Eine QuickInfo zeigt die x- und y-Koordinaten des Mauszeigers an.

Der folgende Beispielcode stammt aus der Fensterprozedur für ein Dialogfeld, in dem die im vorherigen Beispiel erstellte Nachverfolgungs-QuickInfo angezeigt wird. Die globale boolesche Variable g_TrackingMouse wird verwendet, um zu bestimmen, ob die QuickInfo reaktiviert und die Mausnachverfolgung zurückgesetzt werden muss, damit die Anwendung benachrichtigt wird, wenn der Mauszeiger den Clientbereich des Dialogfelds verlässt.

//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;

Verwenden von QuickInfo-Steuerelementen