Jak zaimplementować etykietki narzędzi In-Place
Podpowiedzi narzędzi służą do wyświetlania ciągów tekstowych dla obiektów, które zostały obcięte. Aby zapoznać się z ilustracją, zobacz About Tooltip Controls.
Różnica między zwykłymi a wbudowanymi dymkami pomocy polega na pozycjonowaniu. Domyślnie, gdy wskaźnik myszy znajdzie się nad regionem, z którym jest skojarzona etykietka narzędzia, zostaje ona wyświetlona obok tego regionu. Jednak etykietki narzędzi są oknami i umożliwiają umieszczenie ich w dowolnym miejscu, wywołując SetWindowPos. Tworzenie etykietki narzędzia w miejscu jest kwestią pozycjonowania okna etykietki narzędzia, dzięki czemu nakłada ciąg tekstowy.
Co musisz wiedzieć
Technologie
Warunki wstępne
- C/C++
- Programowanie interfejsu użytkownika systemu Windows
Instrukcje
Pozycjonowanie tooltipu In-Place
Podczas umieszczania etykietki narzędzia w miejscu należy śledzić trzy prostokąty:
- Prostokąt, który otacza pełny tekst etykiety.
- Prostokąt, który otacza tekst etykietki narzędzia. Tekst etykietki narzędzia jest identyczny z pełnym tekstem etykiety, a zwykle jest to ten sam rozmiar i czcionka. Te dwa prostokąty tekstu zwykle będą mieć ten sam rozmiar.
- Prostokąt okna etykietki narzędzia. Ten prostokąt jest nieco większy niż prostokąt etykietki narzędzia, który otacza.
Trzy prostokąty są pokazane schematycznie na poniższej ilustracji. Ukryta część tekstu etykiety jest wskazywana szarym tłem.
Aby utworzyć etykietkę narzędzia w miejscu, należy umieścić prostokąt tekstu etykietki narzędzia, tak aby nakładał prostokąt tekstu etykiety. Procedura wyrównywania dwóch prostokątów jest stosunkowo prosta:
- Zdefiniuj prostokąt etykiety tekstu.
- Umieść okno etykietki narzędzia tak, aby prostokąt tekstu etykietki narzędzia nakładał się na tekst etykiety.
W praktyce zazwyczaj wystarczy wyrównać lewy górny róg dwóch prostokątów tekstu. Próba zmiany rozmiaru prostokąta tekstu etykietki narzędzia w taki sposób, aby był dokładnie zgodny z prostokątem tekstu etykiety, może powodować problemy z wyświetlaniem etykietki narzędzia.
Problem z tym prostym schematem polega na tym, że nie można bezpośrednio umieścić prostokąta tekstu etykietki narzędzia. Zamiast tego należy umieścić prostokąt okna etykietki narzędzia wystarczająco daleko powyżej i z lewej strony prostokąta tekstu etykiety, aby narożniki dwóch prostokątów tekstu pokrywały się. Innymi słowy, musisz znać przesunięcie między prostokątem okna etykietki narzędzia a jego zamkniętym prostokątem tekstu. Ogólnie rzecz biorąc, nie ma prostego sposobu określenia tego przesunięcia.
Wdrożenie In-Place Tooltips
Poniższy fragment kodu ilustruje sposób użycia komunikatu TTM_ADJUSTRECT w procedurze obsługi TTN_SHOW w celu wyświetlenia etykietki narzędzia w miejscu. Aplikacja wskazuje, że tekst etykiety jest obcięty przez ustawienie prywatnej fMyStringIsTruncated zmiennej na TRUE. Procedura obsługi wywołuje funkcję zdefiniowaną przez aplikację, GetMyItemRect, aby pobrać prostokąt tekstu etykiety. Ten prostokąt jest przekazywany do kontroli podpowiedzi z TTM_ADJUSTRECT, która zwraca odpowiedni prostokąt okna. SetWindowPos jest następnie wywoływana, aby umieścić etykietkę narzędzia na etykiecie.
case TTN_SHOW:
if (fMyStringIsTruncated)
{
RECT rc;
GetMyItemRect(&rc);
SendMessage(hwndToolTip, TTM_ADJUSTRECT, TRUE, (LPARAM)&rc);
SetWindowPos(hwndToolTip, NULL, rc.left, rc.top, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
}
Ten przykład nie zmienia rozmiaru etykietki narzędzia, tylko jego położenia. Dwa prostokąty tekstowe są wyrównane do swoich górnych lewych rogów, ale niekoniecznie mają te same wymiary. W praktyce różnica jest zwykle niewielka, a to podejście jest zalecane w większości celów. W zasadzie można użyć SetWindowPos, aby zmienić rozmiar, a także zmienić położenie etykietki narzędzia, co może mieć nieprzewidywalne konsekwencje.
Uwagi
Typowe kontrolki w wersji 5.80 upraszczają używanie etykietek narzędziowych poprzez dodanie nowego komunikatu, TTM_ADJUSTRECT. Prześlij ten komunikat ze współrzędnymi prostokąta tekstu etykiety, na który etykietka narzędzia ma nachodzić, a w odpowiedzi otrzymasz współrzędne odpowiednio umieszczonego prostokąta okna etykietki narzędzia.
Tematy pokrewne