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


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

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

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

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

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

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

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

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

Управления и меню с рисования

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) см. в документации по MFC для CWnd::OnDrawItem, CWnd::OnMeasureItem, 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 при выполнении работу особой обработки. Один случай, когда это будет возможно при дополнительной памяти или других ресурсов хранятся с каждым элементом списка или поля со списком.

Примеры элементов управления и меню с рисования

В примере MFC CTRLTEST общий примеры меню с рисования и списка саморисования.

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

Создание подкласса для динамического

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

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

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

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

3 Эти связанные распространенными способами:

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

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

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

Создание подкласса для динамического можно добиться с помощью методов CWnd::SubclassWindow и CWnd::SubclassDlgItem.

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

В примере CTRLTEST для нескольких примеры применения SubclassWindow и SubclassDlgItem.

См. также

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

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

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