다음을 통해 공유


추적 툴팁을 구현하는 방법

추적 툴팁은 애플리케이션에서 명시적으로 닫지 않으면 계속 표시되며 화면에서 위치를 동적으로 변경할 수 있습니다. 버전 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;
}
            

창 프로시저 구현

마우스 포인터가 클라이언트 영역 내에 있는 경우 도구 설명은 활성 상태이며 다음 그림과 같이 커서 좌표를 표시합니다.

대화 상자의 스크린샷입니다; 도구 설명은 마우스 포인터의 x 및 y 좌표를 보여줍니다

다음 예제 코드는 앞의 예제에서 만든 추적 도구 설명을 표시하는 대화 상자의 창 프로시저에서 나온 것입니다. 전역 부울 변수 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;

툴팁 컨트롤 사용