추적 툴팁을 구현하는 방법
추적 툴팁은 애플리케이션에서 명시적으로 닫지 않으면 계속 표시되며 화면에서 위치를 동적으로 변경할 수 있습니다. 버전 4.70 이상 일반 컨트롤에서 지원됩니다.
추적 도구 설명을 만들기 위해서는, TTM_ADDTOOL 메시지를 보낼 때 TOOLINFO 구조체의 uFlags 멤버에 TTF_TRACK 플래그를 포함해야 합니다.
애플리케이션은 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;
}
창 프로시저 구현
마우스 포인터가 클라이언트 영역 내에 있는 경우 도구 설명은 활성 상태이며 다음 그림과 같이 커서 좌표를 표시합니다.
다음 예제 코드는 앞의 예제에서 만든 추적 도구 설명을 표시하는 대화 상자의 창 프로시저에서 나온 것입니다. 전역 부울 변수 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;
관련 항목