共用方式為


如何實施追蹤工具提示

追蹤工具提示會保持可見狀態,直到應用程式明確關閉為止,而且可以動態變更畫面上的位置。 它們由通用控件 版本 4.70 和後續版本提供支持。

若要建立追蹤工具提示,請在傳送 TTM_ADDTOOL 訊息時,將 TTF_TRACK 標誌包含在 uFlags 成員的 TOOLINFO 結構中。

您的應用程式必須藉由傳送 TTM_TRACKACTIVATE 訊息,手動啟用(顯示)和停用(隱藏)追蹤工具提示。 當追蹤工具提示作用中時,您的應用程式必須將 TTM_TRACKPOSITION 訊息傳送至工具提示控件,以指定工具提示的位置。 因為應用程式會處理定位工具提示等任務,所以追蹤工具提示不會使用 TTF_SUBCLASS 旗標或 TTM_RELAYEVENT 訊息。

TTM_TRACKPOSITION 訊息會讓工具提示控制件使用兩種放置樣式之一來顯示視窗:

  • 根據預設,工具提示會顯示在控件所選擇位置的對應工具旁邊。 選擇的位置與您使用此訊息所提供的座標相對。
  • 如果您在 TOOLINFO 結構的成員中包含 TTF_ABSOLUTE 值,工具提示會顯示在訊息中指定的圖元位置。 在此情況下,控件未嘗試從您提供的座標更改工具提示視窗的位置。

您需要知道的事項

技術

先決條件

  • C/C++
  • Windows 使用者介面程序設計

說明

執行 In-Place 工具提示

範例中使用的 TOOLINFO 結構 uFlags 成員包含 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;
}
            

視窗程序實作

當滑鼠指標位於工作區內時,工具提示會開啟,並顯示游標的座標,如下圖所示。

對話框的螢幕快照;工具提示會顯示滑鼠指標的 x 和 y 座標

下列範例程式碼來自對話方塊的視窗過程,此對話方塊會顯示在上述範例中建立的追蹤工具提示。 全域布爾變數 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;

使用工具提示控制項