Informacje o rysunku niestandardowym
Ta sekcja zawiera ogólne informacje na temat niestandardowych funkcji rysowania i zawiera koncepcyjne omówienie sposobu, w jaki aplikacja może obsługiwać rysowanie niestandardowe. Obecnie następujące kontrolki obsługują niestandardowe funkcje rysowania:
- Kontrolki nagłówka
- Kontrolki widoku listy
- Kontrolki paska pomocniczego
- Kontrolki paska narzędzi
- Kontrolki etykietki narzędzi
- Kontrolki paska suwakowego
- Kontrolki widoku drzewa
- Informacje o niestandardowych komunikatach powiadomień dotyczących rysowania
- cykle malowania, etapy tworzenia rysunku i powiadomienia
- Korzystanie z niestandardowych usług Draw Services
- Rysowanie niestandardowe za pomocą kontrolek List-View i Tree-View
- Tematy pokrewne
Informacje o komunikatach powiadomień „Custom Draw”
Wszystkie typowe kontrolki obsługujące niestandardowe rysowanie wysyłają NM_CUSTOMDRAW kody powiadomień w określonych punktach podczas operacji rysowania. Te kody powiadomień opisują operacje rysowania, które mają zastosowanie do całej kontrolki, a także operacji rysowania specyficznych dla elementów w kontrolce. Podobnie jak wiele kodów powiadomień, powiadomienia NM_CUSTOMDRAW są wysyłane jako komunikaty WM_NOTIFY.
Parametr lParam powiadomienia o rysowaniu niestandardowym będzie adresem struktury NMCUSTOMDRAW lub struktury specyficznej dla kontrolki zawierającej strukturę NMCUSTOMDRAW jako pierwszy element. W poniższej tabeli przedstawiono relację między kontrolkami a używanymi strukturami.
Struktura | Używane przez |
---|---|
NMCUSTOMDRAW | Kontrolki paska narzędzi, paska przewijania i nagłówka |
NMLVCUSTOMDRAW | Kontrolki widoku listy |
NMTBCUSTOMDRAW | Kontrolki paska narzędzi |
NMTTCUSTOMDRAW | Kontrolki etykietki narzędzi |
NMTVCUSTOMDRAW | Kontrolki widoku drzewa |
Cykle malowania, etapy rysunku i komunikaty powiadomień
Podobnie jak w przypadku wszystkich aplikacji systemu Windows, typowe kontrolki okresowo malują i wymazują się na podstawie komunikatów odebranych z systemu lub innych aplikacji. Proces malowania kontrolnego lub wymazywania jest nazywany cyklem farbowania . Kontrolki obsługujące niestandardowe rysowania wysyłają okresowo NM_CUSTOMDRAW kody powiadomień za pośrednictwem każdego cyklu malowania. Ten kod powiadomienia jest dołączony do struktury NMCUSTOMDRAW lub innej struktury zawierającej NMCUSTOMDRAW strukturę jako pierwszy element członkowski.
Jedną z informacji, które zawiera struktura NMCUSTOMDRAW, jest bieżący etap cyklu malowania. Jest to określane jako etap rysowania i jest reprezentowane przez wartość w członku struktury dwDrawStage. Kontrolka informuje element nadrzędny o czterech podstawowych etapach losowania. Te podstawowe lub globalne etapy rysowania są reprezentowane w strukturze przez następujące wartości flagi (zdefiniowane w commctrl.h).
Globalne wartości fazy rysowania | Opis |
---|---|
CDDS_PREPAINT | Przed rozpoczęciem cyklu malowania. |
CDDS_POSTPAINT | Po zakończeniu cyklu malowania. |
CDDS_PREERASE | Przed rozpoczęciem cyklu wymazywania. |
CDDS_POSTERASE | Po zakończeniu cyklu wymazywania. |
Każda z powyższych wartości może być połączona z flagą CDDS_ITEM w celu określenia etapów rysowania specyficznych dla elementów. Dla wygody commctrl.h zawiera następujące wartości specyficzne dla elementu.
Wartości etapu rysowania specyficzne dla elementu | Opis |
---|---|
CDDS_ITEMPREPAINT | Zanim element zostanie narysowany. |
CDDS_ITEMPOSTPAINT | Po wylosowaniu przedmiotu. |
CDDS_ITEMPREERASE | Zanim element zostanie wymazany. |
CDDS_ITEMPOSTERASE | Po wymazaniu elementu. |
CDDS_SUBITEM | typowe wersje kontrolek 4.71. Flaga połączona z CDDS_ITEMPREPAINT lub CDDS_ITEMPOSTPAINT, jeśli element podrzędny jest rysowany. Opcja ta zostanie ustawiona tylko wtedy, gdy CDRF_NOTIFYITEMDRAW zostanie zwrócona z CDDS_PREPAINT. |
Aplikacja musi przetworzyć kod powiadomienia NM_CUSTOMDRAW, a następnie zwrócić określoną wartość, która informuje kontrolkę, do czego ma się odnieść. Więcej informacji na temat tych zwracanych wartości można znaleźć w poniższych sekcjach.
Korzystanie z niestandardowych usług rysunku
Kluczem do korzystania z niestandardowych funkcji rysowania jest reagowanie na kody powiadomień NM_CUSTOMDRAW, które kontrolka wysyła. Wartości zwracane, które aplikacja wysyła w odpowiedzi na te powiadomienia, określają zachowanie kontrolki dla tego cyklu malowania.
Ta sekcja zawiera informacje o tym, jak aplikacja może używać NM_CUSTOMDRAW wartości zwracanych powiadomień w celu określenia zachowania kontrolki.
Szczegóły są podzielone na następujące tematy:
- Odpowiedź na powiadomienie przed malowaniem
- żądanie powiadomień specyficznych dla elementu
- Narysuj element samodzielnie
- Zmienianie czcionek i kolorów
Odpowiadanie na powiadomienie dotyczące malowania
Na początku każdego cyklu malowania kontrolka wysyła kod powiadomienia NM_CUSTOMDRAW, określając wartość CDDS_PREPAINT w dwDrawStage składowej towarzyszącej struktury NM_CUSTOMDRAW. Wartość zwracana przez aplikację do tego pierwszego powiadomienia określa, jak i kiedy kontrolka wysyła kolejne niestandardowe powiadomienia rysowania dla pozostałej części tego cyklu malowania. Aplikacja może zwrócić kombinację następujących flag w odpowiedzi na pierwsze powiadomienie.
Wartość zwracana | Efekt |
---|---|
CDRF_DODEFAULT | Element sterujący narysuje się sam. Nie będzie wysyłać dodatkowych powiadomień NM_CUSTOMDRAW dla tego cyklu malowania. Tej flagi nie można używać z żadną inną flagą. |
CDRF_DOERASE | Kontrolka narysuje tylko tło. |
CDRF_NEWFONT | Aplikacja określiła nową czcionkę dla elementu; kontrolka będzie używać nowej czcionki. Aby uzyskać więcej informacji na temat zmieniania czcionek, zobacz Zmienianie czcionek i kolorów. Dzieje się tak, gdy dwDrawStage równa się CDDS_ITEMPREPAINT. |
CDRF_NOTIFYITEMDRAW | Kontrolka powiadomi element nadrzędny o wszelkich operacjach rysowania specyficznych dla elementu. Spowoduje to wysłanie NM_CUSTOMDRAW kodów powiadomień przed i po rysowaniu elementów. Dzieje się tak, gdy dwDrawStage równa się CDDS_PREPAINT. |
CDRF_NOTIFYPOSTERASE | Kontrolka powiadomi element nadrzędny po wymazaniu elementu. Dzieje się tak, gdy dwDrawStage równa się CDDS_PREPAINT. |
CDRF_NOTIFYPOSTPAINT | Kontrolka wyśle powiadomienie NM_CUSTOMDRAW po zakończeniu cyklu malowania dla całej kontrolki. Dzieje się tak, gdy dwDrawStage równa się CDDS_PREPAINT. |
CDRF_NOTIFYSUBITEMDRAW | w wersji 4.71. Aplikacja otrzyma powiadomienie NM_CUSTOMDRAW z dwDrawStage ustawioną na CDDS_ITEMPREPAINT | CDDS_SUBITEM przed narysem każdego subitem widoku listy. Następnie można określić czcionkę i kolor dla każdego subitem oddzielnie lub zwrócić CDRF_DODEFAULT na potrzeby przetwarzania domyślnego. Dzieje się tak, gdy dwDrawStage równa się CDDS_ITEMPREPAINT. |
CDRF_SKIPDEFAULT | Aplikacja ręcznie narysowała element. Kontrolka nie narysuje elementu. Dzieje się tak, gdy dwDrawStage równa się CDDS_ITEMPREPAINT. |
CDRF_SKIPPOSTPAINT | Kontrolka nie narysuje prostokąta fokusu wokół elementu. |
Żądanie powiadomień specyficznych dla elementu
Jeśli aplikacja zwróci CDRF_NOTIFYITEMDRAW do początkowego wstępnego powiadomienia rysowania niestandardowego, kontrolka będzie wysyłać powiadomienia dla każdego elementu, który rysuje podczas tego cyklu malowania. Te powiadomienia dotyczące elementów będą miały wartość CDDS_ITEMPREPAINT w dwDrawStage członka towarzyszącej strukturze NMCUSTOMDRAW. Możesz zażądać, aby kontrolka wysyłała kolejne powiadomienie po zakończeniu rysowania elementu, zwracając CDRF_NOTIFYPOSTPAINT do tych powiadomień specyficznych dla elementu. W przeciwnym razie zwróć CDRF_DODEFAULT, a kontrolka nie powiadomi okna nadrzędnego, dopóki nie zacznie rysować następnego elementu.
Rysowanie elementu samodzielnie
Jeśli aplikacja rysuje cały element, należy zwrócić CDRF_SKIPDEFAULT. Dzięki temu kontrolka może pominąć elementy, których nie musi rysować, zmniejszając w ten sposób obciążenie systemu. Należy pamiętać, że zwracanie tej wartości oznacza, że kontrolka nie narysuje żadnej części elementu.
Zmienianie czcionek i kolorów
Aplikacja może użyć niestandardowego rysowania, aby zmienić czcionkę elementu. Wystarczy wybrać odpowiedni HFONT do kontekstu urządzenia określonego przez hdc elementu członkowskiego NMCUSTOMDRAW struktury skojarzonej z powiadomieniem o rysowaniu niestandardowym. Ponieważ wybrana czcionka może mieć inne metryki niż czcionka domyślna, upewnij się, że w zwracanej wartości komunikatu z powiadomieniem uwzględnisz bit CDRF_NEWFONT. Aby uzyskać więcej informacji na temat korzystania z tej funkcji, zobacz przykładowy kod w Using Custom Draw. Czcionka określana przez aplikację jest używana do wyświetlania tego elementu, gdy nie jest zaznaczony. Rysowanie niestandardowe nie umożliwia zmiany atrybutów czcionki dla wybranych elementów.
Aby zmienić kolory tekstu dla wszystkich kontrolek obsługujących rysowanie niestandardowe z wyjątkiem widoku listy i widoku drzewa, wystarczy ustawić żądane kolory tekstu i tła w kontekście urządzenia dostarczonego w strukturze powiadomień o rysowaniu niestandardowym za pomocą funkcji SetTextColor oraz SetBkColor. Aby zmodyfikować kolory tekstu w widoku listy lub widoku drzewa, należy umieścić żądane wartości kolorów w składowych clrText i clrTextBk struktury NMLVCUSTOMDRAW lub NMTVCUSTOMDRAW.
Notatka
Przed wersji 6.0 typowych kontrolek paski narzędzi ignorują flagę CDRF_NEWFONT. Wersja 6.0 obsługuje flagę CDRF_NEWFONT i można jej użyć do wybrania innej czcionki dla paska narzędzi. Nie można jednak zmienić koloru paska narzędzi, gdy styl wizualizacji jest aktywny. Aby zmienić kolor paska narzędzi w wersji 6.0, należy najpierw wyłączyć style wizualne, wywołując SetWindowTheme i nie określając stylu wizualnego.
SetWindowTheme (hwnd, "", "");
Rysowanie niestandardowe za pomocą kontrolek List-View i Tree-View
Większość typowych kontrolek można obsługiwać w ten sam sposób. Jednak kontrolki widoku listy i widoku drzewa mają pewne funkcje, które wymagają nieco odmiennego podejścia do rysowania dostosowanego do potrzeb.
W przypadku w wersji 5.0te dwie kontrolki mogą wyświetlać obcięty tekst, jeśli zmienisz czcionkę, zwracając CDRF_NEWFONT. To zachowanie jest niezbędne do zapewnienia zgodności z poprzednimi wersjami wspólnych kontrolek. Jeśli chcesz zmienić czcionkę kontrolki widoku listy lub widoku drzewa, uzyskasz lepsze wyniki, jeśli wyślesz komunikat CCM_SETVERSION z wartością wParam ustawioną na 5 przed dodaniem elementów do kontrolki. Aby zobaczyć przykład kontrolki widoku drzewa wykorzystującej niestandardowe rysowanie, zobacz artykuł z bazy wiedzy SAMPLE: CustDTv ilustruje niestandardowe rysowanie w widoku drzewa (Q248496).
Rysowanie niestandardowe z użyciem kontrolek List-View
Ponieważ kontrolki widoku listy mają podrzędne elementy i wiele trybów wyświetlania, musisz obsłużyć powiadomienie NM_CUSTOMDRAW nieco inaczej niż w przypadku pozostałych typowych kontrolek.
W przypadku trybu raportu użyj poniższej procedury.
- Pierwsze powiadomienie NM_CUSTOMDRAW będzie miało dwDrawStage element skojarzonej struktury NMCUSTOMDRAW ustawiony na CDDS_PREPAINT. Zwróć CDRF_NOTIFYITEMDRAW.
- Następnie otrzymasz powiadomienie NM_CUSTOMDRAW z dwDrawStage ustawionym na CDDS_ITEMPREPAINT. Jeśli określisz nowe czcionki lub kolory i zwrócisz CDRF_NEWFONT, wszystkie elementy podrzędne elementu zostaną zmienione. Jeśli chcesz jednak obsługiwać każdą podpozycję oddzielnie, zwróć CDRF_NOTIFYSUBITEMDRAW.
- Jeśli zwrócono CDRF_NOTIFYSUBITEMDRAW w poprzednim kroku, otrzymasz powiadomienie NM_CUSTOMDRAW dla każdej podpozycji z dwDrawStage ustawionym na CDDS_SUBITEM | CDDS_ITEMPREPAINT. Aby zmienić czcionkę lub kolor dla tego subitemu, określ nową czcionkę lub kolor i zwróć CDRF_NEWFONT.
W przypadku dużych ikon, małych ikon i trybów listy użyj poniższej procedury.
- Pierwsze powiadomienie NM_CUSTOMDRAW będzie mieć dwDrawStage składową skojarzonej struktury NMCUSTOMDRAW ustawioną na CDDS_PREPAINT. Zwróć CDRF_NOTIFYITEMDRAW.
- Następnie otrzymasz powiadomienie NM_CUSTOMDRAW z dwDrawStage ustawione na CDDS_ITEMPREPAINT. Możesz zmienić czcionki lub kolory elementu, określając nowe czcionki i kolory oraz zwracając CDRF_NEWFONT. Ponieważ te tryby nie mają subitemów, nie otrzymasz żadnych dodatkowych powiadomień NM_CUSTOMDRAW.
Aby zapoznać się z przykładem procedury obsługi powiadomień NM_CUSTOMDRAW widoku listy, zobacz Using Custom Draw.
Tematy pokrewne
-
Koncepcyjny
-
Inne zasoby
-
PRZYKŁAD: CustDTv ilustruje niestandardowe rysowanie w TreeView (Q248496)