TN062: Отражение сообщений для элементов управления Windows forms
![]() |
---|
Следующая техническая заметка не была обновлена со времени сначала была включена в подключенной документации.В результате некоторые процедуры и разделы могут оказаться устаревшей или неверны.Последние новости, рекомендуется поиск раздела процента в подключенном индексу документации. |
Эта заметка описывает технический отражение сообщения, новая функция в MFC 4.0.Она также содержит направление для создания простого элемента управления с возможностью повторного использования, использующий отражение сообщения.
Эта заметка не обсуждаются технический отражение сообщений, так как она применяется для вызова элементов управления ActiveX (ранее OLE) элементов управления.Пример см. в статье Элементы управления ActiveX. Subclassing окна контролирует.
Отражение, что сообщения?
Управления windows forms часто отправляют сообщения уведомления к их родительским окна.Например, многие элементы управления отправляет сообщение уведомления цвета элемента управления (WM_CTLCOLOR или одного из его вариантов) к их родительскому элементу, чтобы разрешить родительский для предоставления кисть для рисования фона элемента управления.
В окнах и в MFC до версии 4.0, родительское окно, часто диалоговое окно, отвечает за обработку этих сообщений.Это означает, что код для обработки сообщения должен находиться в классе родительского окна, и он должен быть дублируется в каждом классе, который необходимо обработать это сообщение.В этом случае выше, каждое диалоговое окно, которые хотят элементы управления с пользовательскими фонами обработать сообщение уведомления цвет элемента управления.Будет намного проще повторного использования кода, если класс элемента управления может быть записан, отрегулировал бы свой цвет фона.
В MFC 4.0, старый механизм по-прежнему работает — родительские окна могут обрабатывать сообщения уведомления.Кроме того, однако MFC 4.0 облегчает повторное использование, предоставляя функцию «отражением сообщений», которое позволяет эти сообщения уведомления, чтобы быть обработано в окне дочернего элемента управления или родительском окне или в обеих.В примере цвета фона элемента управления теперь можно создать класс элемента управления, который задает собственный цвет фона при обработке отраженное сообщение WM_CTLCOLOR — не полагаться на все родительские.(Следует отметить, поскольку отражение сообщений реализуется MFC не окнами, класс должен быть производным от родительского окна CWnd для отражения сообщения для действия).
Более ранние версии MFC сделать что-то подобное к отражению сообщения, предоставляя виртуальные функции для нескольких сообщений, например сообщения для владелец-выписанных списков (WM_DRAWITEM и т д).Новый механизм отражения сообщения обобщен и согласован.
Отражение сообщений обратной совместимости с кодом, написанный для версий MFC до 4.0.
Если предоставлены обработчик для конкретного сообщения или для диапазона сообщений в классе своего родительского окна, оно переопределяет отраженные обработчиков сообщений для одного и того же сообщения предоставленного не вызывает функцию обработчика базового класса в собственном системе.Например, если выполняется обработка WM_CTLCOLOR в классе диалогового окна, то обработка переопределяет все отраженные обработчиков сообщений.
Если в классе родительского окна, необходимо указать обработчик для конкретного сообщения WM_NOTIFY или диапазона сообщений WM_NOTIFY, то обработчик будет вызван только в случае, если дочерний элемент управления, отправляющий эти сообщения отсутствует отраженный обработчик сообщений через ON_NOTIFY_REFLECT().При использовании ON_NOTIFY_REFLECT_EX() в сопоставлении сообщений, то обработчик сообщений может существовать или не может разрешить родительское окно для обработки сообщения.Если обработчик получает Ложь, то сообщение обрабатывалось родительским кроме того, пока вызов, который возвращает родительский Истина не допускается.Обратите внимание, что отраженное сообщение обрабатывается до того как сообщение уведомления.
При отправке сообщения WM_NOTIFY предлагают элементу управления возможность первым.Если любое другое отраженное сообщение отправлено, родительское окно имеет возможность обрабатывать их и первый элемент управления осуществляет отраженное сообщение.Чтобы сделать это, для этого потребуется функция обработчика и соответствующую запись в сопоставлении сообщений класса элемента управления.
Макрос сообщение-сопоставления для сообщений автоматически устанавливанных немного отличается от обычных уведомлений: он имеет _REFLECT добавленное к своему имени. normalНапример, должна обработать сообщение WM_NOTIFY в родительском объекте используется макрос ON_NOTIFY в сопоставлении сообщений родительского элемента.Для обработки отраженное сообщение в дочернем элементе управления, используйте макрос ON_NOTIFY_REFLECT в сопоставлении сообщений дочернего элемента управления.В некоторых случаях параметры отличаются.Обратите внимание, что обычно ClassWizard может добавить записи сообщение-сопоставления и предусматривать каркасные реализации функции с правильными параметрами.
См. раздел TN061: сообщения ON_NOTIFY и WM_NOTIFY сведения о новом сообщении WM_NOTIFY.
Записи Сообщение-Сопоставления и прототипы функции обработчика для автоматически устанавливанных сообщений
Для обработки отраженное сообщение уведомления элемента управления, используйте перечисленные макросы сообщение-сопоставления и прототипы функций в таблице ниже.
ClassWizard может обычно добавить эти записи сообщение-сопоставления и предусматривать каркасные реализации функции.См. раздел Определение обработчика сообщений для отраженного сообщения сведения о том, как определить обработчики автоматически устанавливанных сообщений.
Для преобразования из имени сообщения в автоматически устанавливанному имя макроса в начале ON_ и добавьте _REFLECT.Например, WM_CTLCOLOR будет ON_WM_CTLCOLOR_REFLECT.(Чтобы увидеть, какие сообщения может отражать выполните противоположное преобразование в записях макроса в таблице ниже).
3 Исключения из правила выше следующим образом:
Макрос для уведомлений WM_COMMANDON_CONTROL_REFLECT.
Макрос для WM_NOTIFY отражений ON_NOTIFY_REFLECT.
Макрос для ON_UPDATE_COMMAND_UI отражений ON_UPDATE_COMMAND_UI_REFLECT.
В каждом из приведенных выше особых случаях необходимо указать имя функции-члена обработчика.В других случаях необходимо использовать стандартное имя функции обработчика.
Значения параметров и возвращаемых значений функций под именем документированы или функции или имени функции с On добавляется.Например, CtlColor описывается в OnCtlColor.Автоматически устанавливанных нескольких обработчиков сообщений требуется меньшее количество параметров, чем аналогичные обработчики в родительском окне.Просто совпадают с именами в таблице ниже с именами формальных параметров в документации.
Запись сопоставления |
Прототип функции |
---|---|
ON_CONTROL_REFLECT( wNotifyCode###,memberFxn ) |
afx_msg void memberFxn ( ); |
ON_NOTIFY_REFLECT( wNotifyCode###,memberFxn ) |
результат);afx_msg void memberFxn ( NMHDR * pNotifyStruct, LRESULT* |
ON_UPDATE_COMMAND_UI_REFLECT( memberFxn ) |
afx_msg void memberFxn ( CCmdUI* pCmdUI); |
ON_WM_CTLCOLOR_REFLECT () |
afx_msg HBRUSH CtlColor ( CDC* pDC, UINT nCtlColor); |
ON_WM_DRAWITEM_REFLECT () |
afx_msg void DrawItem ( LPDRAWITEMSTRUCT lpDrawItemStruct); |
ON_WM_MEASUREITEM_REFLECT () |
afx_msg void MeasureItem ( LPMEASUREITEMSTRUCT lpMeasureItemStruct); |
ON_WM_DELETEITEM_REFLECT () |
afx_msg void DeleteItem ( LPDELETEITEMSTRUCT lpDeleteItemStruct); |
ON_WM_COMPAREITEM_REFLECT () |
afx_msg int CompareItem ( LPCOMPAREITEMSTRUCT lpCompareItemStruct); |
ON_WM_CHARTOITEM_REFLECT () |
afx_msg int CharToItem ( UINT nKey, UINT nIndex); |
ON_WM_VKEYTOITEM_REFLECT () |
afx_msg int VKeyToItem ( UINT nKey, UINT nIndex); |
ON_WM_HSCROLL_REFLECT () |
afx_msg void HScroll ( UINT nSBCode, UINT nPos); |
ON_WM_VSCROLL_REFLECT () |
afx_msg void VScroll ( UINT nSBCode, UINT nPos); |
ON_WM_PARENTNOTIFY_REFLECT () |
afx_msg void ParentNotify ( UINT message, LPARAM lParam); |
Макросы ON_NOTIFY_REFLECT и ON_CONTROL_REFLECT есть изменения, которые позволяют более чем один объект (например, элемент управления и его родительским элементом) для обработки данного сообщения.
Запись сопоставления |
Прототип функции |
---|---|
ON_NOTIFY_REFLECT_EX( wNotifyCode###,memberFxn ) |
результат);afx_msg BOOL memberFxn ( NMHDR * pNotifyStruct, LRESULT* |
ON_CONTROL_REFLECT_EX( wNotifyCode###,memberFxn ) |
afx_msg BOOL memberFxn ( ); |
Обработка отраженные сообщения: пример многоразового элемента управления
Этот простой пример создает повторно используемый элемент управления с именем CYellowEdit.Элемент управления работает так же, как и обычный элемент управления " Поле ввода ", за исключением того, что отображает черное текст на желтом фоне.Будет легко добавить функции-члены, которые разрешитьTfи бы элемент управления CYellowEdit к цветам отображения другим.
Выполните пример, который создает элемент управления с возможностью повторного использования
Создайте новое диалоговое окно в существующем приложении.Дополнительные сведения см. в разделе Редактор диалоговых окон.
Необходимо иметь приложение, в котором разработать элемент управления с возможностью повторного использования.Если отсутствует существующее приложение, используемое, создайте приложение на основе диалоговых окон с помощью AppWizard.
С проекта, загруженный в Visual C++, используйте ClassWizard, чтобы создать новый класс с именем CYellowEdit на основе CEdit.
Добавьте значение 3 переменной члена к классу CYellowEdit.Первые 2 являются переменными COLORREF для хранения цвет текста и цвет фона.Третий является объектом CBrush, который будет содержать кисть для рисования фона.Объект CBrush позволяет создать кисть раз, просто обращение к его после того, и разрушать кисть автоматически, когда элемент управления CYellowEdit удалено.
Инициализируйте переменные членов путем написания конструктор следующим образом:
CYellowEdit::CYellowEdit() { m_clrText = RGB( 0, 0, 0 ); m_clrBkgnd = RGB( 255, 255, 0 ); m_brBkgnd.CreateSolidBrush( m_clrBkgnd ); }
Использование ClassWizard добавьте обработчик для отраженного сообщения WM_CTLCOLOR к классу CYellowEdit.Обратите внимание, что знак равенства перед именем сообщения в списке сообщений можно обработать указывает, что сообщение автоматически устанавливается.Это описано в Определение обработчика сообщений для отраженного сообщения.
ClassWizard добавляет следующий макрос сообщение-сопоставления и функция каркасная:
ON_WM_CTLCOLOR_REFLECT() // Note: other code will be in between.... HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) { // TODO: Change any attributes of the DC here // TODO: Return a non-NULL brush if the // parent's handler should not be called return NULL; }
Замените текст функции следующим кодом.Код определяет цвет текста, цвет фона текста и цвет фона для остальной части элемента управления.
pDC->SetTextColor( m_clrText ); // text pDC->SetBkColor( m_clrBkgnd ); // text bkgnd return m_brBkgnd; // ctl bkgnd
Создание элемента управления " Поле ввода " в диалоговом окне вложение, то его переменной члена, дважды щелкнув элемент управления " Поле ввода " с сохранением клавиши элемента управления вниз.В диалоговом окне добавление переменной члена, полное имя переменной и выберите «элемента управления» для категории, затем «CYellowEdit» для переменной типа.Не забудьте задать последовательность табуляции в диалоговом окне.Кроме того, обязательно включать файл заголовка для элемента управления CYellowEdit в файле заголовка данного диалогового окна.
Скомпонуйте и запустите приложение.Элемент управления " Поле ввода " будет иметь желтый фон.