Поделиться через


TN014: пользовательские элементы управления

Эта заметка описывает поддержку MFC для пользовательских элементов управления и собственный-документа.Он также описывает динамический subclassing и описывает связи между объектами CWnd и HWND.

Пример приложения MFC CTRLTEST показано, как использовать много пользовательских элементов управления.См. раздел исходный код для образца CTRLTEST MFC без ограничений и справки в интернете.

Меню рисования владельцем управления/

Окна обеспечивают поддержку элементов управления и меню рисования владельцем с помощью сообщений windows.Родительское окно любого элемента управления или меню получает эти сообщения и вызывает функции в ответе.Можно переопределить эти функции для настройки внешнего вида и функциональности элементов управления или меню рисования владельцем.

MFC непосредственно поддерживают рисование владельцем со следующими функциями:

Можно переопределить эти функции в производном классе CWnd для реализации настраиваемой расширения функциональности рисования.

Этот подход не приводит к многоразовому коду.Если имеется 2 сходных элементов управления в 2 различных классах CWnd, необходимо реализовать расширения функциональности пользовательского элемента управления в 2 местах.MFC-поддержанная архитектура элементов управления собственный-документа решает эту проблему.

Управления и меню Собственн-Притяжки

MFC предоставляет реализацию по умолчанию (в CWnd и классах CMenu ) для стандартных сообщения рисования владельцем.Эта реализация по умолчанию расшифровывает параметры рисования владельцем и делегатов сообщения рисования владельцем к элементам управления или меню.Это называется собственный-притяжкой поскольку код документа в классе или элемента управления меню, а не в окне владелец.

С помощью элементов управления собственный-притяжки можно создавать многократно используемые классы элемента управления, использующие семантику рисования владельцем для отображения элемента управления.Код для рисования элемента управления в классе элемента управления, а не его родительского объекта.Это объект-ориентированный подход к программированию пользовательского элемента управления.Добавьте следующий список функций к классам собственный-притяжки:

  • Для кнопок собственный-притяжки:

    CButton:DrawItem(LPDRAWITEMSTRUCT);
            // insert code to draw this button
    
  • В меню собственный-притяжки:

    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
    
  • Для списков собственный-притяжки:

    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
    
  • Для полей со списком собственный-притяжки:

    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
    

Дополнительные сведения о структурах рисования владельцем (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCT и DELETEITEMSTRUCT) в документации по CWnd::OnDrawItem, CWnd::OnMeasureItem, MFC для CWnd::OnCompareItem и CWnd::OnDeleteItem соответственно.

Использование элементов управления и меню собственный-притяжки

В меню собственный-притяжки необходимо переопределить и методы OnMeasureItem и OnDrawItem.

Для списков и полей со списком собственный-притяжки необходимо переопределить OnMeasureItem и OnDrawItem.Необходимо указать стиль LBS_OWNERDRAWVARIABLE для списков или полей со списком стиль CBS_OWNERDRAWVARIABLE в шаблоне диалогового окна.Стиль OWNERDRAWFIXED не будет работать с элементами собственный-притяжки, поскольку имеют фиксированную высоту элемента управления определяется прежде чем собственный-притяжки вложенные в список.(Можно использовать методы CListBox::SetItemHeight и CComboBox::SetItemHeight для преодоления это ограничение).

Переключение на OWNERDRAWVARIABLE стиль требует систему NOINTEGRALHEIGHT применение стиля к элементу управления.Поскольку элемент управления не может вычислить объединенную высоту с переменной - размер не учитываются, определенные элементы стиля по умолчанию INTEGRALHEIGHT и элемент управления всегда NOINTEGRALHEIGHT.Если элементы имеют фиксированную высоту, то можно запретить частично элементы из выписанным, указав размер элемента управления множителем целого числа размера элемента.

Для списков и полей со списком собственный-документа с учетом LBS_SORT или CBS_SORT необходимо переопределить метод OnCompareItem.

Для списков и полей со списком собственный-документа, OnDeleteItem обычно не переопределяется.Можно переопределить OnDeleteItem если нужно, чтобы выполнять любую их особой обработки.Один вариант, где это применимо, если дополнительная память или другие ресурсы хранятся с каждым элементом списка или поля со списком.

Примеры элементов управления и меню Собственн-Документа

Пример CTRLTEST MFC предоставляет образцы меню общие собственный-притяжки и списка собственный-притяжки.

Самый типичный пример кнопки собственный-документа кнопку растрового изображения.Кнопка растрового изображения кнопка, которая показывает один, 2 или 3 образы растрового изображения для различных состояний.Пример этого приведен в классе CBitmapButton MFC.

Динамическое Subclassing

Иногда требуется изменить функциональность уже существующего объекта.Предыдущий необходимости требовали, что настраивали элементы управления, прежде чем они были созданы.Динамический subclassing позволяет настраивать элемент управления, который уже был создан.

Subclassing терминов окна для окна заменить WndProc с настраиванным WndProc и вызвать старое WndProc по умолчанию для функциональных возможностей.

Это не следует путать с выводом класса C++.Для пояснения выражения базовый класс C++ и производный класс аналогичны суперклассу и подклассу в объектной модели windows.Наследование C++ с MFC и окна subclassing функционально похожи, за исключением того, что C++ не поддерживает динамический subclassing.

Класс CWnd предоставляет объект C++ связь между (производный от CWnd) и объект окна windows (известный как HWND).

3 Общих способа они связаны.

  • CWnd создает HWND.Можно изменить поведение в производном классе, создайте класс, производный от CWnd.HWND создается, когда приложение вызывает CWnd::Create.

  • Приложение вложение CWnd к существующему HWND.Реакция на событие существующего окна не вносятся изменения.В этом случае делегирования и сделать возможной путем вызова CWnd::Attach к псевдониму существующим HWND к объекту CWnd.

  • CWnd вложенный к существующему HWND и можно изменить поведение в производном классе.Это называется динамическим subclassing поскольку мы изменим функциональности, и поэтому класс объекта windows во время выполнения.

Динамический subclassing которые можно получить с помощью методов CWnd::SubclassWindow и CWnd::SubclassDlgItem.

Обе процедуры вложат объект CWnd к существующему HWND.SubclassWindow принимает HWND напрямую.SubclassDlgItem вспомогательная функция, которая принимает идентификатор элемента управления, и родительское окно.SubclassDlgItem предназначен для вложения объектов C++ к элементам управления диалогового окна, созданные из шаблона диалогового окна.

См. пример CTRLTEST некоторые примеры использования, когда использовать SubclassWindow и SubclassDlgItem.

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям