Эта записка описание поддержки MFC для пользовательских и саморисования элементов управления. Описывается динамическое создание подклассов. Представлены общие консультации по собственности объектов CWnd против HWNDs.
Пример приложения MFC CTRLTEST иллюстрирует многие из этих функций. Обратитесь к исходному коду для образца MFC Генеральной CTRLTEST и интерактивная справка.
Владельцем элементов управления/меню
Windows предоставляет поддержку для элементов управления «владелец ничьей» и меню. Это Windows сообщения, отправляемые в родительского окна элемента управления или меню, которые позволяют вам настроить внешний вид и поведение элемента управления или элемента меню.
MFC поддерживает владельца вничью с записей карты сообщения:
Можно переопределить это в вашем CWnd-производного класса (обычно диалоговое окно или фрейм главного окна) для реализации поведения рисования владельцем.
Этот подход не приводит к повторно используемый код. Если у вас есть два аналогичных элементов управления в двух разных диалоговых окон, необходимо реализовать поведение пользовательского элемента управления в двух местах. Архитектура MFC поддерживают саморисования управления решает эту проблему.
Саморисования элементов управления и меню
MFC предоставляет реализацию по умолчанию (в CWnd и CMenu) для рисования владельцем стандартных сообщений. Эта реализация по умолчанию будет декодировать параметры рисования владельцем и делегировать рисования владельцем сообщений для элементов управления или меню. Это называется «self-draw» так как код прорисовки (/ измерения/сравнения) в классе элемента управления или меню, в окне владелец не.
Это позволяет создавать классы повторно используемых элементов управления, которые отображения элемента управления с помощью «владелец рисовать» семантики. Код для рисования элемента управления, не является владельцем элемента управления находится в класс элемента управления. Это объектно ориентированный подход к программированию пользовательского элемента управления.
CButto&n:DrawItem(LPDRAWITEMSTRUCT);
nbsp; / / обратить эту кнопку
CMe&nu:MeasureItem(LPMEASUREITEMSTRUCT);
nbsp; / / оценить размер элемента в этом меню
CMenu:DrawItem(LPDRAWITEMSTRUCT);
/ / нарисовать элемент в это меню
CListBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / оценить размер элемента в этом списке
CListBox:DrawItem(LPDRAWITEMSTRUCT);
/ / нарисовать элемент в этом списке
CListBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / сравнить два элемента в этом списке, если LBS_SORT
CListBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / удалить элемент из этого списка
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);
/ / оценить размер элемента в поле со списком
CComboBox:DrawItem(LPDRAWITEMSTRUCT);
/ / нарисовать элемент в этом поле со списком
CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);
/ / сравнить два пункта в этом раскрывающемся списке, если CBS_SORT
CComboBox:DeleteItem(LPDELETEITEMSTRUCT);
/ / удалить элемент из этого списком
Для подробной информации о рисования владельцем структур (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; Технические примечания по категориям