Bagikan melalui


Cara Menerapkan Tooltip Pelacakan

Tooltip pelacakan tetap terlihat sampai ditutup secara eksplisit oleh aplikasi, dan posisinya dapat berubah di layar secara dinamis. Mereka didukung oleh versi 4.70 dan yang lebih baru dari kontrol umum.

Untuk membuat tooltip pelacakan, sertakan flag TTF_TRACK di anggota uFlags dalam strukturTOOLINFOsaat mengirim pesan TTM_ADDTOOL.

Aplikasi Anda harus secara manual mengaktifkan (menampilkan) dan menonaktifkan (menyembunyikan) tooltip pelacakan dengan mengirim pesan TTM_TRACKACTIVATE. Saat tipsalat pelacakan aktif, aplikasi Anda harus menentukan lokasi tipsalat dengan mengirim pesan TTM_TRACKPOSITION ke kontrol tipsalat. Karena aplikasi menangani tugas seperti memposisikan tooltip, tooltip pelacakan tidak menggunakan bendera TTF_SUBCLASS atau pesan TTM_RELAYEVENT.

Pesan TTM_TRACKPOSITION menyebabkan kontrol tipsalat menampilkan jendela menggunakan salah satu dari dua gaya penempatan:

  • Secara default, tipsalat ditampilkan di samping alat yang sesuai dalam posisi yang dipilih kontrol. Lokasi yang dipilih relatif terhadap koordinat yang Anda berikan dengan menggunakan pesan ini.
  • Jika Anda menyertakan nilai TTF_ABSOLUTE dalam anggota struktur TOOLINFO, tooltip ditampilkan di lokasi piksel yang ditentukan dalam pesan. Dalam hal ini, kontrol tidak mencoba mengubah lokasi jendela tooltip dari koordinat yang Anda berikan.

Apa yang perlu Anda ketahui

Teknologi

Prasyarat

  • C/C++
  • Pemrograman Antarmuka Pengguna Windows

Peraturan

Menerapkan Tooltip In-Place

uFlags parameter dari strukturTOOLINFOyang digunakan dalam contoh mencakup flag TTF_ABSOLUTE. Tanpa bendera ini, kontrol tipsalat memilih tempat untuk menampilkan tipsalat, dan posisinya relatif terhadap kotak dialog dapat berubah tiba-tiba saat penunjuk mouse bergerak.

Nota

g_toolItem adalah struktur TOOLINFO global.

 

Contoh berikut menunjukkan cara membuat kontrol tooltip pelacakan. Contoh ini menentukan seluruh area klien dari jendela utama sebagai alat.

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;
}
            

Implementasi Prosedur untuk Jendela

Saat penunjuk mouse berada di dalam area klien, tooltip aktif dan menampilkan koordinat kursor, seperti yang ditunjukkan dalam ilustrasi berikut.

cuplikan layar kotak dialog; tooltip menampilkan koordinat x dan y dari pointer mouse

Contoh kode berikut berasal dari prosedur jendela untuk kotak dialog yang menampilkan tipsalat pelacakan yang dibuat dalam contoh sebelumnya. Variabel Boolean global g_TrackingMouse digunakan untuk menentukan apakah perlu mengaktifkan kembali tipsalat dan mengatur ulang pelacakan mouse sehingga aplikasi diberi tahu ketika penunjuk mouse meninggalkan area klien dari kotak dialog.

//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;

Menggunakan Kontrol Petunjuk Alat