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ó.
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;
Kapcsolódó témakörök