Come implementare le descrizioni comando di rilevamento
Le descrizioni comando di rilevamento rimangono visibili finché non vengono chiuse in modo esplicito dall'applicazione e possono modificare la posizione sullo schermo in modo dinamico. Sono supportate dalla versione 4.70 e successive dei controlli comuni.
Per creare una descrizione comando di rilevamento, includere il flag TTF_TRACK nel membro uFlags della struttura TOOLINFO quando si invia il messaggio di TTM_ADDTOOL.
L'applicazione deve attivare manualmente (mostrare) e disattivare (nascondere) una descrizione comando di rilevamento inviando un messaggio di TTM_TRACKACTIVATE . Mentre è attiva una descrizione comando di rilevamento, l'applicazione deve specificare il percorso della descrizione comando inviando TTM_TRACKPOSITION messaggi al controllo descrizione comando. Poiché l'applicazione gestisce attività come il posizionamento della descrizione comando, le descrizioni comando di rilevamento non usano il flag TTF_SUBCLASS o il messaggio di TTM_RELAYEVENT .
Il messaggio TTM_TRACKPOSITION fa sì che il controllo descrizione comando visualizzi la finestra usando uno dei due stili di posizionamento:
- Per impostazione predefinita, la descrizione comando viene visualizzata accanto allo strumento corrispondente in una posizione selezionata dal controllo. La posizione scelta è relativa alle coordinate fornite usando questo messaggio.
- Se si include il valore TTF_ABSOLUTE nel membro della struttura TOOLINFO , la descrizione comando viene visualizzata nella posizione in pixel specificata nel messaggio. In questo caso, il controllo non tenta di modificare la posizione della finestra della descrizione comando dalle coordinate fornite.
Informazioni importanti
Tecnologie
Prerequisiti
- C/C++
- Programmazione dell'interfaccia utente di Windows
Istruzioni
Implementare descrizioni comando sul posto
Il membro uFlags della struttura TOOLINFO utilizzato nell'esempio include il flag TTF_ABSOLUTE . Senza questo flag, il controllo descrizione comando sceglie dove visualizzare la descrizione comando e la relativa posizione relativa alla finestra di dialogo può cambiare improvvisamente quando si sposta il puntatore del mouse.
Nota
g_toolItem
è una struttura TOOLINFO globale.
Nell'esempio seguente viene illustrato come creare un controllo descrizione comando di rilevamento. Nell'esempio viene specificata l'intera area client della finestra principale come strumento.
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;
}
Implementazione della procedura finestra
Quando il puntatore del mouse si trova all'interno dell'area client, la descrizione comando è attiva e visualizza le coordinate del cursore, come illustrato nella figura seguente.
Il codice di esempio seguente proviene dalla routine della finestra per una finestra di dialogo che visualizza la descrizione comando di rilevamento creata nell'esempio precedente. La variabile booleana globale g_TrackingMouse viene usata per determinare se è necessario riattivare la descrizione comando e reimpostare il rilevamento del mouse in modo che l'applicazione venga notificata quando il puntatore del mouse lascia l'area client della finestra di dialogo.
//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;
Argomenti correlati