Megosztás a következőn keresztül:


Hogyan valósítsunk meg nyomkövető súgókat

A követési elemleírások mindaddig láthatók maradnak, amíg az alkalmazás nem zárja be őket, és dinamikusan változtathatják helyzetüket a képernyőn. A közös vezérlők 4.70-es és újabb verziói támogatják őket.

Követési elemleírás létrehozásához a TTF_TRACK jelölőt szerepeltetni kell a uFlags mezőben a TOOLINFO struktúrában, amikor a TTM_ADDTOOL üzenetet küldjük.

Az alkalmazásnak manuálisan kell aktiválnia (megjelenítenie) és inaktiválnia (elrejtenie) egy nyomkövetési elemleírást egy TTM_TRACKACTIVATE üzenet küldésével. Bár a nyomkövetési elemleírás aktív, az alkalmazásnak meg kell adnia az elemleírás helyét úgy, hogy TTM_TRACKPOSITION üzeneteket küld az elemleírás-vezérlőnek. Mivel az alkalmazás olyan feladatokat kezel, mint az elemleírás elhelyezése, a nyomkövetési elemleírások nem használják a TTF_SUBCLASS jelzőt vagy a TTM_RELAYEVENT üzenetet.

A TTM_TRACKPOSITION üzenet hatására az eszköztipp vezérlő kétféle elrendezési stílus egyikével jeleníti meg az ablakot.

  • Alapértelmezés szerint az elemleírás a vezérlő által választott helyzetben jelenik meg a megfelelő eszköz mellett. A kiválasztott hely az üzenet használatával megadott koordinátákhoz viszonyítva van.
  • Ha a TTF_ABSOLUTE értéket a TOOLINFO struktúrájának tagjában adja meg, az elemleírás az üzenetben megadott képponthelyen jelenik meg. Ebben az esetben a vezérlő nem próbálja módosítani az eszköztipp ablakának elhelyezkedését az ön által megadott koordináták alapján.

Amit tudnia kell

Technológiák

Előfeltételek

  • C/C++
  • Windows felhasználói felület programozása

Előírás

In-Place súgók implementálása

A példában használt TOOLINFO struktúrájának uFlags tagja a TTF_ABSOLUTE jelzőt is tartalmazza. E jelző nélkül az elemleírás-vezérlő kiválasztja, hogy hol jelenjen meg az elemleírás, és a párbeszédpanelhez viszonyított helyzete hirtelen megváltozhat az egérmutató mozgása közben.

Jegyzet

g_toolItem egy globális TOOLINFO struktúra.

 

Az alábbi példa bemutatja, hogyan hozhat létre nyomkövetési elemleírás-vezérlőt. A példa a főablak teljes ügyfélterületét adja meg eszközként.

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

Ablakeljárás implementálása

Ha az egérmutató a kliens területen belül van, az elemleírás aktív, és megjeleníti a kurzor koordinátáit, ahogyan az az alábbi ábrán látható.

párbeszédpanel képernyőképe; egy tooltip az egérmutató x és y koordinátáit jeleníti meg

Az alábbi példakód egy párbeszédablak ablakeljárásából származik, amely megjeleníti az előző példában létrehozott nyomkövetési elemleírót. A g_TrackingMouse globális logikai változó határozza meg, hogy szükséges-e az eszköztippet újra aktiválni, és az egérkövetést visszaállítani alaphelyzetbe. Ezáltal az alkalmazás értesítést kap, amikor az egérmutató elhagyja a párbeszédpanel ügyfélterületét.

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

Elemleírás-vezérlők használata