Uwaga ta opisuje MFC obsługę formantów niestandardowych i self-drawing. Podklasy dynamicznej jest również opisany. Przedstawiono ogólne porady dotyczące własności obiektów CWnd vs. HWNDs.
Przykładowa aplikacja MFC CTRLTEST ilustruje wiele z tych funkcji. Prosimy przeczytaµ kod źródłowy dla próbki ogólnej MFC CTRLTEST i pomoc online.
Rysowania przez właściciela formantów/menu
System Windows zapewnia obsługę kontrole „właściciel Rysuj"i menu. Są one komunikatów systemu Windows wysyłanego do okna nadrzędnego kontroli lub menu, które pozwalają dostosować wygląd i zachowanie formantu lub menu.
MFC bezpośrednio obsługuje Rysuj właściciela z zapisami mapę wiadomości:
Można zastąpić w Twojej CWnd-klasy (zwykle okno dialogowe lub okno główne ramek) do wykonania zachowanie rysowania przez właściciela.
Takie podejście nie prowadzi do wielokrotnego użycia kodu. Jeśli masz dwa podobne formanty w dwóch różnych oknach dialogowych musi implementować zachowanie formantu niestandardowego w dwóch miejscach. Architektura obsługiwane MFC self-drawing kontroli rozwiązuje ten problem.
Self-Drawing kontroli i menu
MFC przewiduje Domyślna implementacja (w CWnd i CMenu) wiadomości standardowych rysowania przez właściciela. Ta implementacja domyślną będzie dekodowania parametry rysowania przez właściciela i przekazać wiadomości rysowania przez właściciela, aby formanty lub menu. Jest to tak zwane "self-draw" ponieważ rysunku kodu (pomiaru/porównanie) jest w klasie kontroli lub menu, nie w oknie właściciela.
Umożliwia to tworzenie klas wielokrotnego użytku kontroli, wyświetlających formantu, używając "właściciel rysowanie" semantyki. Kod rysunku formant, nie jest właścicielem formantu, jest w klasie kontroli. Jest to zorientowany obiektowo podejścia do programowania formantu niestandardowego.
CButto&n:DrawItem(LPDRAWITEMSTRUCT);
nbsp; / / draw ten przycisk
CMe&nu:MeasureItem(LPMEASUREITEMSTRUCT);
nbsp; / / mierzenia rozmiaru elementu menu
CMenu:DrawItem(LPDRAWITEMSTRUCT);
/ / draw pozycji w menu
CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / mierzenia rozmiaru elementu w tym polu listy
CListBox:DrawItem(LPDRAWITEMSTRUCT);
/ / draw element w tym polu listy
CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / porównać dwie pozycje w polu listy, jeśli LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / Usuń element w tym polu listy
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / mierzenia rozmiaru elementu w tym polu kombi
CComboBox:DrawItem(LPDRAWITEMSTRUCT);
/ / draw element w tym polu kombi
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / porównać dwie pozycje w polu kombi, jeśli CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / Usuń element z tego pola kombi
Szczegółowe informacje na temat rysowania właściciel struktury (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTi DELETEITEMSTRUCT) dotyczą dokumentacji MFC CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItemi CWnd::OnDeleteItem odpowiednio.
Za pomocą self-drawing kontroli i menu
Self-drawing menu należy zastąpić zarówno MeasureItem , jak i DrawItem funkcje składowe.
Do self-drawing pola listy i pola kombi, należy zastąpić MeasureItem i DrawItem. W szablonie okna dialogowego należy określić styl OWNERDRAWVARIABLE (LBS_OWNERDRAWVARIABLE i CBS_OWNERDRAWVARIABLE odpowiednio). Styl OWNERDRAWFIXED nie będzie działać z self-drawing elementów, ponieważ wysokość stały element jest określona przed self-drawing formanty są dołączone do pola listy. (Członek wygrać 3.1 funkcje CListBox::SetItemHeight i CComboBox::SetItemHeight można uzyskać wokół tego ograniczenia.)
Ponadto należy zauważyć, że przełączania do stylu OWNERDRAWVARIABLE wpłynie na styl NOINTEGRALHEIGHT . Ponieważ formant nie może obliczyć integralną wysokości zmiennej wielkości elementów, domyślny styl INTEGRALHEIGHT jest ignorowany i kontroli jest zawsze NOINTEGRALHEIGHT. Jeśli elementy są ustalone wysokość, można zapobiec częściowe elementów z rysowana określając rozmiar formantu ma być integralną mnożnik rozmiar elementu.
Do self-drawing pola listy i pola kombi stylem sortowania (LBS_SORT i CBS_SORT odpowiednio), należy zastąpić funkcję Państwa CompareItem.
Do self-drawing pola listy i pola kombi, DeleteItem nie jest zwykle przesłonięte. DeleteItem może być zastąpiona, jeżeli dodatkowa pamięć lub inne zasoby są przechowywane z każdego elementu pola listy, jak pola lub kombi.
Przykłady Self-Drawing kontroli/menu
Próbki ogólnej MFC CTRLTEST udostępnia próbkach self-draw menu (wyświetlane kolory) oraz pola listy self-draw (także wyświetlane kolory).
Najbardziej typowym przykładem self-drawing przycisk znajduje się przycisk Mapa bitowa (przycisk, który pokazuje jeden, dwa lub trzy obrazy bitmapowe do różnych Państw). Jest to zapewnione klasy MFC CBitmapButton.
Podklasy dynamicznej
Podklasy jest określenie systemu Windows zastępując WndProc okna z różnymi WndProc i wywoływanie starego WndProc dla funkcji domyślna (nadklasą).
Powinno to nie mylić z C++ klasy wyprowadzenie (C++ terminologii zastosowań wyrazy "base" i "pochodzące", natomiast model obiektów systemu Windows używa "super" i "sub"). Wyprowadzenie C++ z podklasy MFC i Windows są funkcjonalnie bardzo podobne, z wyjątkiem C++ obsługuje funkcję podobną do podklasy dynamicznej.
Klasa CWnd udostępnia połączenia między obiektem C++ (pochodzące z CWnd) i obiekt window systemu Windows (znany również jako HWND).
Istnieją trzy sposoby wspólne, które są powiązani:
Tego ostatniego przypadku odbywa się z funkcje składowe:
Do istniejącego systemu Windows HWNDobu procedur dołączyć obiekt CWnd . SubclassWindow przyjmuje HWND bezpośrednio, a SubclassDlgItem jest biblioteką pomocniczą, która pobiera identyfikator formantu i okno nadrzędne (zazwyczaj okna dialogowego). SubclassDlgItem jest przeznaczony do dołączania obiektami C++ do formantów okna dialogowego utworzony na podstawie szablonu okno dialogowe.
Prosimy przeczytaµ CTRLTEST o przykład kilka przykładów kiedy korzystać z SubclassWindow i SubclassDlgItem.
Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii