Udostępnij za pośrednictwem


Kontrolki z obsługą Built-In Owner-Drawing

Rysunek właściciela w formularzach systemu Windows, nazywany również rysunkiem niestandardowym, jest techniką zmiany wyglądu wizualizacji niektórych kontrolek.

Uwaga

Słowo "control" w tym temacie służy do oznaczania klas, które pochodzą z Control lub Component.

Zazwyczaj system Windows automatycznie obsługuje malowanie przy użyciu ustawień właściwości, takich jak BackColor w celu określenia wyglądu kontrolki. Za pomocą rysunku właściciela przejmujesz proces malowania, zmieniając elementy wyglądu, które nie są dostępne przy użyciu właściwości. Na przykład wiele kontrolek umożliwia ustawienie koloru wyświetlanego tekstu, ale jest ograniczony do jednego koloru. Rysunek właściciela umożliwia wykonywanie takich czynności, jak wyświetlanie części tekstu w kolorze czarnym i części czerwonej.

W praktyce rysowanie przez właściciela jest podobne do rysowania grafiki na formularzu. Na przykład można użyć metod graficznych w procedurze obsługi dla zdarzenia Paint formularza w celu emulowania kontrolki ListBox, ale trzeba byłoby napisać własny kod do obsługi całej interakcji użytkownika. Za pomocą rysunku właściciela kontrolka używa kodu do rysowania jego zawartości, ale w przeciwnym razie zachowuje wszystkie jego możliwości wewnętrzne. Metody graficzne umożliwiają rysowanie każdego elementu w kontrolce lub dostosowywanie niektórych aspektów każdego elementu podczas używania domyślnego wyglądu dla innych aspektów każdego elementu.

Rysunek właściciela w kontrolkach formularzy systemu Windows

Aby wykonać rysunek właściciela w kontrolkach, które go obsługują, zazwyczaj ustawisz jedną właściwość i obsłużysz co najmniej jedno zdarzenie.

Większość kontrolek obsługujących rysunek właściciela ma właściwość OwnerDraw lub DrawMode wskazującą, czy kontrolka zgłosi zdarzenie związane z rysunkiem, czy zdarzenia podczas malowania.

Kontrolki, które nie mają OwnerDraw lub DrawMode, obejmują kontrolkę DataGridView, która udostępnia zdarzenia rysunku, które występują automatycznie, oraz kontrolkę ToolStrip, która jest rysowana przy użyciu zewnętrznej klasy renderowania, która ma własne zdarzenia związane z rysunkiem.

Istnieje wiele różnych rodzajów zdarzeń rysunku, ale typowe zdarzenie rysunku występuje w celu narysowania pojedynczego elementu w kontrolce. Program obsługi zdarzeń odbiera obiekt EventArgs zawierający informacje o rysowanym elemencie i narzędzia, których można użyć do narysowania. Na przykład ten obiekt zazwyczaj zawiera numer indeksu elementu w kolekcji nadrzędnej, Rectangle wskazujący granice wyświetlania elementu oraz obiekt Graphics do wywoływania metod malowania. W przypadku niektórych zdarzeń obiekt EventArgs zawiera dodatkowe informacje o elemencie i metodach, które można wywołać w celu malowania niektórych aspektów elementu domyślnie, takich jak tło lub prostokąt fokusu.

Aby utworzyć kontrolkę wielokrotnego użytku zawierającą dostosowania rysowane przez właściciela, utwórz nową klasę pochodzącą z klasy kontrolnej obsługującej rysunek właściciela. Zamiast obsługiwać zdarzenia rysunku, dołącz kod rysunku właściciela do przesłonięć dla odpowiedniej metody OnEventName lub metod w nowej klasie. Upewnij się, że wywołujesz metody klasy bazowej OnEventName, aby użytkownicy Twojej kontrolki mogli obsługiwać zdarzenia związane z rysowaniem przez właściciela i zapewniać dodatkowe opcje dostosowywania.

Następujące kontrolki Windows Forms obsługują rysowanie przez właściciela we wszystkich wersjach środowiska .NET Framework:

Następujące kontrolki obsługują rysunek właściciela tylko w programie .NET Framework 2.0:

Następujące kontrolki obsługują rysunek właściciela i są nowe w programie .NET Framework 2.0:

Poniższe sekcje zawierają dodatkowe szczegóły dla każdej z tych kontrolek.

Kontrolki ListBox i ComboBox

Kontrolki ListBox i ComboBox umożliwiają rysowanie poszczególnych elementów w kontrolce w jednym rozmiarze lub w różnych rozmiarach.

Notatka

Mimo że kontrolka CheckedListBox pochodzi z kontrolki ListBox, nie obsługuje rysunku właściciela.

Aby narysować każdy element o tym samym rozmiarze, ustaw właściwość DrawMode na OwnerDrawFixed i obsłuż zdarzenie DrawItem.

Aby rysować każdy element przy użyciu innego rozmiaru, ustaw właściwość DrawMode na OwnerDrawVariable i obsłuż zarówno zdarzenia MeasureItem, jak i DrawItem. Zdarzenie MeasureItem umożliwia wskazanie rozmiaru elementu przed wystąpieniem zdarzenia DrawItem dla tego elementu.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy:

Składnik MenuItem reprezentuje pojedynczy element menu w składniku MainMenu lub ContextMenu.

Aby narysować MenuItem, ustaw jego właściwość OwnerDraw na true i obsłuż zdarzenie DrawItem. Aby dostosować rozmiar elementu menu przed wystąpieniem zdarzenia DrawItem, obsłuż zdarzenie MeasureItem elementu.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy referencyjne:

TabControl, kontrolka

Kontrolka TabControl umożliwia rysowanie poszczególnych kart w kontrolce. Rysunek właściciela ma wpływ tylko na zakładki; zawartość TabPage nie ulega zmianie.

Aby narysować każdą kartę w TabControl, ustaw właściwość DrawMode na OwnerDrawFixed i obsłuż zdarzenie DrawItem. To zdarzenie występuje raz dla każdej karty tylko wtedy, gdy karta jest widoczna w kontrolce.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy referencyjne:

ToolTip, komponent

Składnik ToolTip umożliwia rysowanie całej podpowiedzi, gdy jest wyświetlana.

Aby narysować ToolTip, ustaw właściwość OwnerDraw na true i obsłuż zdarzenie Draw. Aby dostosować rozmiar ToolTip przed zajściem zdarzenia Draw, obsłuż zdarzenie Popup i ustaw właściwość ToolTipSize w handlerze zdarzeń.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy referencyjne:

Kontrolka ListView

Kontrolka ListView umożliwia rysowanie poszczególnych elementów, elementów podrzędnych i nagłówków kolumn w kontrolce.

Aby włączyć rysunek właściciela w kontrolce, ustaw właściwość OwnerDraw na wartość true.

Aby narysować każdy element w kontrolce, obsłuż zdarzenie DrawItem.

Aby narysować każdy podpunkt lub nagłówek kolumny w kontrolce, gdy właściwość View została ustawiona na Details, obsłuż zdarzenia DrawSubItem i DrawColumnHeader.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy referencyjne:

Kontrolka TreeView

Kontrolka TreeView umożliwia rysowanie poszczególnych węzłów w kontrolce.

Aby narysować tylko tekst wyświetlany w każdym węźle, ustaw właściwość DrawMode na OwnerDrawText i obsłuż zdarzenie DrawNode, aby narysować tekst.

Aby narysować wszystkie elementy każdego węzła, ustaw właściwość DrawMode na OwnerDrawAll i obsłuż zdarzenie DrawNode, aby narysować potrzebne elementy, takie jak tekst, ikony, pola wyboru oraz znaki minus i linie łączące węzły.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy referencyjne:

Kontrolka DataGridView

Kontrolka DataGridView umożliwia rysowanie pojedynczych komórek i wierszy w kontrolce.

Aby narysować poszczególne komórki, obsługiwać zdarzenie o nazwie CellPainting.

Aby narysować poszczególne wiersze lub elementy wierszy, obsłuż zdarzenie RowPrePaint, RowPostPaint lub oba. Zdarzenie RowPrePaint występuje przed malowaniem komórek w wierszu, a zdarzenie RowPostPaint występuje po pomalowaniu komórek. Można obsługiwać zarówno zdarzenia, jak i zdarzenie CellPainting, aby malować tło wiersza, poszczególne komórki i pierwszy plan wiersza oddzielnie. Można też podać konkretne dostosowania, w których są potrzebne, i użyć domyślnego wyświetlania dla innych elementów wiersza.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy:

Pasek narzędzi, kontrolka

ToolStrip i pochodne kontrolki umożliwiają dostosowanie dowolnego aspektu ich wyglądu.

Aby zapewnić renderowanie niestandardowe dla kontrolek ToolStrip, ustaw właściwość Renderer obiektu ToolStrip, ToolStripManager, ToolStripPanellub ToolStripContentPanel na obiekt ToolStripRenderer i obsłuż jedno lub więcej zdarzeń rysowania dostarczonych przez klasę ToolStripRenderer. Alternatywnie ustaw właściwość Renderer na wystąpienie własnej klasy pochodzącej z ToolStripRenderer, ToolStripProfessionalRendererlub ToolStripSystemRenderer, która implementuje lub zastępuje określone metody OnEventName.

Aby uzyskać więcej informacji, w tym przykłady kodu, zobacz następujące tematy:

Zobacz też