Udostępnij za pośrednictwem


TN014: Formanty niestandardowe

Uwaga ta opisuje wsparcie MFC formantów niestandardowych i self-drawing.Również w tym artykule opisano tworzenie podklasy dynamicznej oraz opisuje relację między CWnd obiektów i HWNDs.

Przykładowa aplikacja MFC CTRLTEST ilustruje sposób użycia wielu formantów niestandardowych.Zobacz kod źródłowy dla próbki ogólnej MFC CTRLTEST i pomocy online.

Formanty/menu rysowania przez właściciela

Windows zapewnia obsługę formantów rysowania przez właściciela i menu za pomocą komunikatów systemu Windows.Okno nadrzędne sterowania lub menu otrzymuje te wiadomości i wywołania funkcji 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 sieci CWnd klasy do wdrożenia zachowanie niestandardowych draw.

Takie podejście nie prowadzi do wielokrotnego użycia kodu.Jeśli dwóch podobnych formantów w dwóch różnych CWnd klasy, zachowanie formantu niestandardowego należy zaimplementować w dwóch lokalizacjach.Architektura obsługiwane MFC self-drawing kontroli rozwiązuje ten problem.

Self-Draw kontroli i menu

MFC zapewnia implementację domyślnej (w CWnd i CMenu klasy) dla wiadomości standardowych rysowania przez właściciela.Ta implementacja domyślne będzie dekodowania parametry rysowania przez właściciela i delegowanie wiadomości rysowania przez właściciela do menu lub formantów.Jest to self-draw, ponieważ kod rysunku w klasie sterowania lub menu, a nie w oknie właściciela.

Używając formantów self-draw można utworzyć klasy kontroli wielokrotnego użytku, które umożliwia wyświetlanie formantu semantykę rysowania przez właściciela.Kod kontroli rysunku jest klasy kontroli, a nie jego obiektu nadrzędnego.Jest to object-oriented podejście do programowania formantu niestandardowego.Dodaj następującą listę funkcji do klas self-draw:

  • W przypadku przycisków, self-draw:

    CButton:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw this button
    
  • Self-draw 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 listy self-draw:

    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 self-draw:

    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
    

Szczegółowe informacje na temat struktury rysowania przez właściciela (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT, i DELETEITEMSTRUCT) można znaleźć w dokumentacji MFC CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItem, i CWnd::OnDeleteItem odpowiednio.

Przy użyciu formantów self-draw i menu

Self-draw menu, należy zastąpić zarówno OnMeasureItem i OnDrawItem metody.

Dla pola self-draw 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 kombi pola w szablonie okna dialogowego.OWNERDRAWFIXED Styl nie będzie działać z elementami self-draw wysokości elementu stałych jest ustalana przed self-draw 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 wymusza systemu, aby zastosować styl NOINTEGRALHEIGHT styl do formantu.Ponieważ formant nie może obliczyć integralną wysokość ze zmiennej wielkości elementów, domyślny styl z INTEGRALHEIGHT jest ignorowany i zawsze jest formant NOINTEGRALHEIGHT.Jeśli elementy są ustalane w wysokości, zapobieganie rysowana, określając rozmiar formantu musi być całkowitą mnożnik rozmiaru elementu częściowe elementów.

Do self-drawing pola listy i pola kombi z LBS_SORT lub CBS_SORT styl, należy zastąpić OnCompareItem metody.

Do self-drawing pola listy i pola kombi, OnDeleteItem nie jest zwykle pomijana.Można zastąpić OnDeleteItem , jeśli chcesz wykonać żadnych specjalnych przetwarzania.Jeden przypadek, w których byłoby to stosowane jest, gdy dodatkowa pamięć lub inne zasoby są przechowywane z każdego elementu pola listy, jak pole lub pola kombi.

Przykłady Self-Drawing formanty i menu

Próbki ogólnej MFC CTRLTEST przykłady self-draw menu i pola listy self-draw.

Najbardziej typowym przykładem self-drawing przycisk jest przyciskiem, mapy bitowej.Przycisk mapy bitowej jest przycisk, który pokazuje jeden, dwa lub trzy obrazy bitmapowe do różnych Państw.Przykładem jest świadczone w klasy MFC CBitmapButton.

Dynamiczne tworzenie podklasy.

Od czasu do czasu będzie chcesz zmienić funkcję obiekt, który już istnieje.Poprzednie przykłady wymagane można dostosować formanty, przed ich utworzenia.Dynamiczne tworzenie podklasy umożliwia dostosowywanie formantu, który został już utworzony.

Podklasy jest określenie systemu Windows dla zastąpienia WndProc okna z dostosowany WndProc i wywoływanie starego WndProc domyślne funkcji.

To nie należy mylić z wyprowadzenie klasy C++.Wyjaśnienia, warunki C++ klasy bazowej i klasy są analogiczne do Superklasa i podklasy w modelu obiektów systemu Windows.Wyprowadzenie C++ z podklasy MFC i Windows są podobne, z wyjątkiem C++ nie obsługuje dynamiczne tworzenie podklasy.

CWnd Klasy stanowi 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.Zachowanie w klasie pochodnej można zmodyfikować, tworząc klasy pochodzącej od CWnd.HWND Jest tworzony, gdy aplikacja wywołuje CWnd::Create.

  • Dołącza aplikacji CWnd do istniejącego HWND.Zachowanie istniejących okno nie jest modyfikowany.To jest w przypadku delegacji i jest to możliwe, wywołując CWnd::Attach alias istniejących HWND do CWnd obiektu.

  • CWndjest dołączony do istniejącego HWND i zachowanie w klasie pochodnej można modyfikować.Jest to dynamiczne tworzenie podklas, ponieważ zmieniamy zachowanie i dlatego klasy obiektu 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 pomocnika, który ma identyfikator formantu i okno nadrzędne.SubclassDlgItemjest przeznaczony do dołączania obiekty C++ do formantów okna dialogowego utworzony na podstawie szablonu okna dialogowego.

Zobacz CTRLTEST przykład kilka przykładów zastosowania SubclassWindow i SubclassDlgItem.

Zobacz też

Inne zasoby

Uwagi techniczne przez liczbę

Uwagi techniczne według kategorii