Udostępnij za pośrednictwem


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.

Zobacz też

Inne zasoby

Uwagi techniczne według numerów

Uwagi techniczne według kategorii