TN014: formanty niestandardowe
Uwaga ta opisuje MFC obsługę formantów niestandardowych i własny rysunek.Również w tym artykule opisano podklasy dynamicznej i opisuje relację między CWnd obiekty i HWNDs.
MFC Przykładowa aplikacja CTRLTEST ilustruje sposób użycia wielu formantów niestandardowych.Zobacz kod źródłowy dla próbki ogólnej MFC CTRLTEST oraz pomoc online.
Formanty/menu rysowania przez właściciela
System Windows zapewnia obsługę formantów rysowania przez właściciela i menu za pomocą komunikatów systemu Windows.Okno nadrzędne dowolnego formantu lub menu odbiera tych funkcji wiadomości i połączenia w odpowiedzi.Można zastąpić te funkcje, aby dostosować wygląd i zachowanie formantu rysowania przez właściciela lub menu.
MFC bezpośrednio obsługuje rysowania przez właściciela z następujących funkcji:
Można zastąpić te funkcje w swojej CWnd klasy do wdrożenia rysować niestandardowe zachowanie.
Takie podejście nie prowadzi do wielokrotnego użycia kodu.Jeśli masz dwa podobne kontrole w dwóch różnych CWnd klas, zachowanie formantu niestandardowego należy zaimplementować w dwóch lokalizacjach.MFC obsługiwane architektury sterowania własny rysunek rozwiązuje ten problem.
Narysować własny formantów i menu
Domyślna implementacja zapewnia MFC (w CWnd i CMenu klas) komunikaty standardowe rysowania przez właściciela.Ta implementacja domyślnie będzie dekodowania parametry rysowania przez właściciela i delegowanie wiadomości rysowania przez właściciela do formantów lub menu.Jest to samodzielnie rysować ponieważ rysunek kod znajduje się w klasie formantu lub menu, a nie w oknie właściciela.
Za pomocą formantów samodzielnie rysować można zbudować klasy kontroli wielokrotnego użytku, które służy do wyświetlania formantu semantyka rysowania przez właściciela.Kod do rysowania formantu jest w klasie kontroli, a nie jego obiektu nadrzędnego.Jest to pewna strategia programowania formantu niestandardowego zorientowanym obiektowo.Dodaj następujące listy funkcji do klas samodzielnie rysować:
Narysować własny przycisków:
CButton:DrawItem(LPDRAWITEMSTRUCT); // insert code to draw this button
Narysować własny menu:
CMenu:MeasureItem(LPMEASUREITEMSTRUCT); // insert code to measure the size of an item in this menu CMenu:DrawItem(LPDRAWITEMSTRUCT); // insert code to draw an item in this menu
Dla pola narysować własny list:
CListBox:MeasureItem(LPMEASUREITEMSTRUCT); // insert code to measure the size of an item in this list box CListBox:DrawItem(LPDRAWITEMSTRUCT); // insert code to draw an item in this list box CListBox:CompareItem(LPCOMPAREITEMSTRUCT); // insert code to compare two items in this list box if LBS_SORT CListBox:DeleteItem(LPDELETEITEMSTRUCT); // insert code to delete an item from this list box
Dla pola kombi samodzielnie rysować:
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT); // insert code to measure the size of an item in this combo box CComboBox:DrawItem(LPDRAWITEMSTRUCT); // insert code to draw an item in this combo box CComboBox:CompareItem(LPCOMPAREITEMSTRUCT); // insert code to compare two items in this combo box if CBS_SORT CComboBox:DeleteItem(LPDELETEITEMSTRUCT); // insert code to delete an item from this combo box
Aby uzyskać szczegółowe informacje na temat struktur rysowania przez właściciela (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT, i DELETEITEMSTRUCT) można znaleźć w dokumentacji usługi MFC CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItem, i CWnd::OnDeleteItem odpowiednio.
Za pomocą formantów samodzielnie rysować i menu
Menu Rysuj własny, należy zastąpić zarówno OnMeasureItem i OnDrawItem metody.
Dla pola samodzielnie rysować listy i pola kombi, należy zastąpić OnMeasureItem i OnDrawItem.Należy określić LBS_OWNERDRAWVARIABLE styl dla pola listy lub CBS_OWNERDRAWVARIABLE styl dla kombi pola w szablonie okno dialogowe.OWNERDRAWFIXED Styl nie będzie działać z elementami samodzielnie rysować wysokości środka elementu jest ustalana przed własny narysować formanty są dołączone do pola listy. (Można użyć metod CListBox::SetItemHeight i CComboBox::SetItemHeight Aby ominąć to ograniczenie.)
Przełączanie do OWNERDRAWVARIABLE styl wymusi system, aby stosował NOINTEGRALHEIGHT styl do formantu.Ponieważ formant nie może obliczać integralną wysokość ze zmienną wielkości elementów, domyślnego stylu INTEGRALHEIGHT jest ignorowany i zawsze jest formant NOINTEGRALHEIGHT.Jeżeli Twoje przedmioty są stałą wysokość, można zablokować sformułowane określając rozmiar formantu ma być mnożnik całkowitą wielkość elementu elementów podzielonych na części.
Aby uzyskać własny rysunek pola listy i pola kombi z LBS_SORT lub CBS_SORT styl, należy zastąpić OnCompareItem metody.
Aby uzyskać własny rysunek pola listy i pola kombi, OnDeleteItem zazwyczaj nie jest zastępowany.Można zastąpić OnDeleteItem Jeśli chcesz wykonywać żadnych specjalnych przetwarzania.Jeden przypadek, w których byłoby to stosowane jest, gdy dodatkową pamięć lub inne zasoby są przechowywane z każdego elementu pola listy, jak pola lub kombi.
Przykłady własny rysunek formantów i menu
Próbki ogólnej MFC CTRLTEST podano przykłady menu Rysuj własny i pole listy samodzielnie rysować.
Najbardziej typowym przykładem własny rysunek przycisku znajduje się przycisk mapy bitowej.Przycisk mapy bitowej jest przycisk, który pokazuje jeden, dwa lub trzy obrazy bitmapowe do różnych Państw.Przykładem tego jest świadczone w klasie MFC CBitmapButton.
Podklasy dynamicznej
Od czasu do czasu można zmienić funkcjonalność obiektu, który już istnieje.Poprzednich przykładach wymagane do dostosowywania formanty, zanim zostały utworzone.Podklasy dynamicznej umożliwia dostosowywanie formantu, który już został utworzony.
Podklasy jest termin Windows wymiana WndProc okna z dostosowanego WndProc i wywoływanie starego WndProc dla funkcji domyślnego.
To nie należy mylić z wyprowadzenie klasy języka C++.Dla wyjaśnienia, warunki C++ klasy bazowej i klasy są analogiczne do Superklasa i podklasy w modelu obiektów programu Windows.Wyprowadzenie C++ z podklasy MFC i Windows są podobne, z wyjątkiem języka C++ nie obsługuje dynamicznego można utworzyć podklas.
CWnd Klasy zapewnia połączenie między obiektem C++ (pochodzące z CWnd) i obiekt window systemu Windows (znane jako HWND).
Istnieją trzy sposoby wspólnej odnoszą się one:
CWndTworzy HWND.Można zmodyfikować zachowanie w klasie pochodnej, tworząc klasę pochodną CWnd.HWND Jest tworzony, gdy aplikacja wywołuje CWnd::Create.
Dołącza aplikacji CWnd do istniejącego HWND.Zachowanie istniejącego okna nie jest modyfikowany.To jest w przypadku delegacji i jest możliwe poprzez wywołanie CWnd::Attach do alias istniejącego HWND do CWnd obiektu.
CWndjest dołączony do istniejącego HWND i można zmodyfikować zachowanie w klasie pochodnej.Jest to nazywane dynamiczne rozszerzanie ponieważ Zmieniamy zachowanie, a zatem klasy, obiektu systemu Windows w czasie wykonywania.
Podklasy dynamicznej można osiągnąć za pomocą metody CWnd::SubclassWindow iCWnd::SubclassDlgItem.
Dołącz obu procedur CWnd obiektu do istniejącego HWND.SubclassWindowprzyjmuje HWND bezpośrednio.SubclassDlgItemjest funkcja helper, która ma identyfikator formantu i okno nadrzędne.SubclassDlgItemjest przeznaczony do dołączania do utworzonej na podstawie szablonu okno dialogowe formanty okna dialogowego z obiektami C++.
Zobacz CTRLTEST przykład kilka przykładów zastosowania SubclassWindow i SubclassDlgItem.