追跡ツールヒントを実装する方法
追跡ツールヒントは、アプリケーションによって明示的に閉じられるまで表示され、画面上で動的に位置を変更できます。 これらは、一般的なコントロールのバージョン 4.70 以降でサポートされています。
追跡ツールヒントを作成するには、TTM_ADDTOOL メッセージ送信時に、TOOLINFO 構造体の uFlags メンバーに TTF_TRACK フラグを含めます。
アプリケーションでは、TTM_TRACKACTIVATE メッセージを送信して、追跡ツールヒントを手動でアクティブ化 (表示) および非アクティブ化 (非表示) する必要があります。 追跡ツールヒントがアクティブな場合、アプリケーションは、ツールヒント コントロールに TTM_TRACKPOSITION メッセージを送信して、ツールヒントの場所を指定する必要があります。 アプリケーションはツールヒントの配置などのタスクを処理するため、追跡ツールヒントでは TTF_SUBCLASS フラグや TTM_RELAYEVENT メッセージは使用されません。
TTM_TRACKPOSITION メッセージにより、ツールヒント コントロールは、次の 2 つの配置スタイルのいずれかを使用してウィンドウを表示します。
- 既定では、ツールヒントは、コントロールが選択した位置に対応するツールの横に表示されます。 選択した場所は、このメッセージを使用して指定した座標に対して相対的です。
- TOOLINFO 構造体のメンバーに TTF_ABSOLUTE 値を含めた場合、ツールヒントはメッセージで指定されたピクセル位置に表示されます。 この場合、コントロールはツールヒント ウィンドウの位置を指定した座標から変更しようとしません。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
インプレース ツールヒントの実装
この例で使用されている TOOLINFO 構造体の uFlags メンバーには、TTF_ABSOLUTE フラグが含まれています。 このフラグがない場合、ツールヒント コントロールはツールヒントを表示する場所を選択します。マウス ポインターが移動すると、ダイアログ ボックスに対する相対的な位置が突然変わる場合があります。
Note
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;
関連トピック