如何實作追蹤工具提示
追蹤工具提示會保持可見狀態,直到應用程式明確關閉為止,而且可以動態變更畫面上的位置。 這些控制項是由 4.70 版和更新版本的通用控制項所支援。
若要建立追蹤工具提示,請在傳送TTM_ADDTOOL訊息時,將TTF_TRACK旗標包含在 TOOLINFO 結構的 uFlags 成員中。
您的應用程式必須藉由傳送 TTM_TRACKACTIVATE 訊息,手動啟動(顯示)並停用追蹤工具提示。 當追蹤工具提示作用中時,您的應用程式必須將TTM_TRACKPOSITION訊息傳送至工具提示控件,以指定工具提示的位置。 因為應用程式會處理工作,例如定位工具提示,因此追蹤工具提示不會使用TTF_SUBCLASS旗標或TTM_RELAYEVENT訊息。
TTM_TRACKPOSITION訊息會導致工具提示控制件使用兩種放置樣式之一來顯示視窗:
- 根據預設,工具提示會顯示在控件所選擇位置的對應工具旁邊。 選擇的位置與您使用此訊息所提供的座標相對。
- 如果您在 TOOLINFO 結構的成員中包含TTF_ABSOLUTE值,工具提示會顯示在訊息中指定的圖元位置。 在此情況下,控件不會嘗試從您提供的座標變更工具提示視窗的位置。
您需要知道的事項
技術
必要條件
- C/C++
- Windows 使用者介面程序設計
指示
實作就地工具提示
範例中使用的 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;
}
視窗程序實作
當滑鼠指標位於工作區內時,工具提示為使用中,並顯示游標座標,如下圖所示。
下列範例程式代碼來自對話框的視窗程式,此對話框會顯示在上述範例中建立的追蹤工具提示。 全域布爾變數 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;
相關主題