추적 도구 설명을 구현하는 방법
추적 도구 설명은 애플리케이션에서 명시적으로 닫을 때까지 계속 표시되며 화면에서 위치를 동적으로 변경할 수 있습니다. 공용 컨트롤의 버전 4.70 이상에서 지원됩니다.
추적 도구 설명을 만들려면 TTM_ADDTOOL 메시지를 보낼 때 TOOLINFO 구조체의 uFlags 멤버에 TTF_TRACK 플래그를 포함합니다.
애플리케이션은 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;
관련 항목