共用方式為


如何實作 In-Place 工具提示

原位工具提示可用來顯示被裁切的物件的文字字串。 如需圖例,請參閱 關於工具提示控件

一般和就地工具提示之間的差異在於定位。 根據預設,當滑鼠指標停留在具有與其相關聯工具提示的區域上時,工具提示會顯示在區域相鄰。 不過,工具提示是視窗,而且您可以呼叫 SetWindowPos,將其放置在您選擇的任何位置。 建立就地工具提示需要將工具提示視窗定位於文字字串之上。

您需要知道的事項

技術

先決條件

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

說明

定位 In-Place 工具提示

在定位內嵌提示時,您需要追蹤三個矩形框:

  1. 圍繞完整標籤文字的矩形。
  2. 圍繞工具提示文字的矩形。 工具提示文字與完整的標籤文字相同,而且通常大小和字型相同。 因此,這兩個文字矩形的大小通常相同。
  3. 工具提示視窗的矩形。 這個矩形稍微大於其所括的工具提示文字矩形。

下圖以圖解方式顯示這三個矩形。 標籤文字的隱藏部分會以灰色背景表示。

顯示長字串的圖表,其中一半的背景為灰色,然後在較大的工具提示視窗矩形中顯示相同的字串

若要建立就地工具提示,您必須將工具提示文字矩形放置在標籤文字矩形之上,以使其重疊。 對齊兩個矩形的程序相當簡單:

  1. 定義標籤文字矩形。
  2. 放置工具提示視窗,使工具提示文字矩形重疊標籤文字矩形。

實際上,通常只需對齊兩個文本矩形的左上角即可。 嘗試調整工具提示文字矩形的大小,以完全符合標籤文字矩形,可能會導致工具提示顯示發生問題。

這個簡單配置的問題在於您無法直接放置工具提示文字矩形。 相反地,您必須將工具提示窗矩形精確地放置在標籤文字矩形的正上方和左側,以確保兩個文字矩形的角落恰好相接。 換句話說,您必須知道工具提示視窗矩形與其封閉文字矩形之間的位移。 一般而言,判斷此位移沒有簡單的方法。

實作 In-Place 工具提示

下列代碼段說明如何使用 TTN_SHOW 處理程式中的 TTM_ADJUSTRECT 訊息來顯示就地工具提示。 透過將私有 fMyStringIsTruncated 變數設定為 TRUE,應用程式會截斷標籤文字。 處理程式會呼叫應用程式定義的函式,GetMyItemRect來擷取標籤文字矩形。 這個矩形會傳遞至具有 TTM_ADJUSTRECT的工具提示控件,這會傳回對應的視窗矩形。 接著會呼叫 SetWindowPos,以將工具提示定位到標籤上方。

case TTN_SHOW:
            
    if (fMyStringIsTruncated) 
    {
        RECT rc;
        
        GetMyItemRect(&rc);
        
        SendMessage(hwndToolTip, TTM_ADJUSTRECT, TRUE, (LPARAM)&rc);
        
        SetWindowPos(hwndToolTip, NULL, rc.left, rc.top, 0, 0, 
                     SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
    }

此範例不會變更工具提示的大小,而只會變更其位置。 這兩個文字矩形會對齊在其左上角,但大小不一定相同。 在實務上,差異通常很小,因此在大部分情況下,建議使用此方法。 雖然您原則上可以使用 SetWindowPos 來重設大小,以及重新定位工具提示,但這樣做可能會產生無法預測的結果。

備註

通用控制項 5.80 版 藉由新增新訊息來簡化就地工具提示的使用,TTM_ADJUSTRECT。 傳送此訊息,附上您想讓工具提示重疊的標籤文字矩形的座標,它將傳回適當位置工具提示視窗矩形的座標。

使用工具提示控件