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

Эта записка описание поддержки MFC для пользовательских и саморисования элементов управления. Описывается динамическое создание подклассов. Представлены общие консультации по собственности объектов CWnd против HWNDs.

Пример приложения MFC CTRLTEST иллюстрирует многие из этих функций. Обратитесь к исходному коду для образца MFC Генеральной CTRLTEST и интерактивная справка.

Владельцем элементов управления/меню

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

MFC поддерживает владельца вничью с записей карты сообщения:

Можно переопределить это в вашем CWnd-производного класса (обычно диалоговое окно или фрейм главного окна) для реализации поведения рисования владельцем.

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

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

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

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

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

Использование саморисования элементов управления и меню

Для саморисования меню необходимо переопределить MeasureItem и DrawItem функций-членов.

Для self-drawing списков и полей со списком, необходимо переопределить MeasureItem и DrawItem. В диалоговом окне шаблон необходимо указывать OWNERDRAWVARIABLE стиль (LBS_OWNERDRAWVARIABLE и CBS_OWNERDRAWVARIABLE соответственно). OWNERDRAWFIXED стиль не будет работать с self-drawing пунктов, так как фиксированный элемент высота определяется прежде чем саморисования элементы управления привязаны к в списке. (Win 3.1 член функции CListBox::SetItemHeight и CComboBox::SetItemHeight может использоваться для обхода этого ограничения).

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

Для self-drawing списков и полей со списком СОРТИРОВКА стиле (LBS_SORT и CBS_SORT соответственно), необходимо переопределить функцию-член CompareItem.

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

Примеры саморисования контроль/меню

В примере MFC Генеральной CTRLTEST предоставляет примеры из self-draw меню (цветов) и self-draw список (показывая цветов).

Наиболее типичным примером саморисования кнопки — это растровое изображение кнопка (кнопка, которая показывает один, два или три растровых изображений для различных государств). Это предусмотрено в класс MFC CBitmapButton.

Динамическое создание подклассов

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

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

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

Существует три распространенных способа, которыми они связаны:

Этот последний случай делается с функциями-членами:

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

Обратитесь к CTRLTEST пример для несколько примеров использования SubclassWindow и SubclassDlgItem.

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

Index