TN062: Сообщение отражение для элементов управления Windows

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

Эта техническая записка не рассматривается отражение сообщения, как он относится к элементам управления ActiveX (ранее — элементы управления OLE). Обратитесь к статье элементов управления ActiveX: Создание подклассов элемента управления Windows в Руководстве по Visual C++ программист.

Что такое отражение сообщения?

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

В Windows и в MFC до версии 4.0 родительское окно, часто диалоговое окно, отвечает за обработку этих сообщений. Это означает, что код для обработки сообщения необходимо находиться в классе родительского окна и что она должна дублироваться в каждом классе, который необходимо обработать это сообщение. В случае выше каждое диалоговое окно хотят контроль с пользовательской среды необходимо обработать сообщение уведомления цвет элемента управления. Было бы гораздо проще повторно использовать код, если класс элемента управления может быть записан, которые будет обрабатывать собственный цвет фона.

В MFC 4.0, старый механизм по-прежнему работает — windows родитель может обрабатывать сообщения уведомления. Кроме того, однако, MFC 4.0 облегчает повторное использование, предоставляя функцию под названием «сообщение отражение» которая позволяет эти уведомления сообщений для обработки в окне управления ребенка или в родительском окне, либо в обоих. В примере цвет фона элемента управления, теперь можно написать класс элемента управления, который устанавливает собственный цвет фона путем обработки отраженное сообщение WM_CTLCOLOR — все это не полагаясь на родителя. (Обратите внимание, что так как отражение сообщение осуществляется MFC, не в Windows, родительского окна класс должен быть производным от CWnd для размышлений сообщение для работы).

Более старые версии MFC сделал что-то похожее сообщение отражения, предоставляя виртуальные функции для нескольких сообщений, такие как сообщения для списков, рисуемого владельцем (WM_DRAWITEMи т. д.). Новый механизм отражения сообщений общей и последовательной.

Отражение сообщения имеет обратную совместимость с кодом, написанным для версии MFC до 4.0.

Если вы предоставили обработчика для определенного сообщения, или для целого ряда сообщений, в классе родительского окна, он переопределяет отражение обработчики сообщений для того же сообщения условии не называют функции обработчика базового класса в собственный обработчик. К примеру если вы обрабатывать WM_CTLCOLOR в вашем классе box диалогового окна, ваши обращения будут переопределять Обработчики отраженных сообщений.

Если в вашем классе родительского окна, предоставить обработчик для конкретного сообщения WM_NOTIFY или диапазон WM_NOTIFY сообщений, ваш обработчик будет вызываться только если дочерний элемент управления, передачи этих сообщений не имеет обработчика отраженное сообщение через ON_NOTIFY_REFLECT(). Если вы используете ON_NOTIFY_REFLECT_EX() в схеме сообщений, обработчик сообщений могут или не могут позволить родительского окна для обработки сообщения. Если обработчик возвращает значение TRUE, сообщение будет обработано родитель также, во время вызова, который возвращает значение FALSE запрещает родителя для его обработки. Обратите внимание, что отраженное сообщение обрабатывается до сообщения уведомления.

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

Макрос карты сообщений для отраженного сообщения немного отличается от обычных уведомлений: он имеет _REFLECT к его обычным именем. К примеру чтобы обработать сообщение WM_NOTIFY в родительском, используется макрос ON_NOTIFY в схеме сообщений родительского элемента. Для обработки отраженное сообщение в дочернем элементе управления, используйте макрос ON_NOTIFY_REFLECT в схеме сообщений дочернего элемента управления. В некоторых случаях параметры различны, как хорошо. Обратите внимание, что ClassWizard обычно можно добавить записи карты сообщение для вас и предоставить основа реализации с правильными параметрами.

Посмотреть TN061: ON_NOTIFY и WM_NOTIFY сообщений сведения о новой ошибке WM_NOTIFY.

Записей сообщений карты и прототипы функций обработчика для отраженного сообщения

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

ClassWizard обычно можно добавить эти записи в схеме сообщений для вас и предоставлять основа реализации. Посмотреть Определение обработчика сообщений для сообщения, отражено в руководство Visual C++ программиста для сведений о том, как определить обработчики для отражение сообщений.

Для преобразования из имени сообщения отражают имя макроса, добавьте в начало ON_ и добавить _REFLECT. К примеру WM_CTLCOLOR становится ON_WM_CTLCOLOR_REFLECT. (Чтобы посмотреть, какие сообщения могут быть отражены, делать противоположное преобразование макросов записей в таблице ниже).

Три исключения из правила выше, являются:

В каждом из вышеупомянутых особых случаев необходимо указать имя функции-члена обработчика. В остальных случаях необходимо использовать стандартное имя функции обработчика.

Значения параметров и возвращаемых значений функций описаны в имени функции или имя функции с на начало списка. К примеру CtlColor описана в OnCtlColor. Некоторые обработчики отраженных сообщений требуется меньшее число параметров, чем аналогичные обработчики в родительском окне. Просто совпадать с именами в таблице ниже с именами формальных параметров в документации.

Записи карты Прототип функции
ON_CONTROL_REFLECT ( wNotifyCode, memberFxn ) void afx_msgmemberFxn ( );
ON_NOTIFY_REFLECT ( wNotifyCode, memberFxn ) void afx_msgmemberFxn(NMHDR * pNotifyStruct, LRESULT * результат );
ON_UPDATE_COMMAND_UI_REFLECT ( memberFxn ) void afx_msgmemberFxn(CCmdUI * pCmdUI );
ON_WM_CTLCOLOR_REFLECT) afx_msg HBRUSH CtlColor (CDC * pDC, UINT nCtlColor );
ON_WM_DRAWITEM_REFLECT) afx_msg аннулировать DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct );
ON_WM_MEASUREITEM_REFLECT) afx_msg аннулировать MeasureItem (LPMEASUREITEMSTRUCT lpMeasureItemStruct );
ON_WM_DELETEITEM_REFLECT) afx_msg аннулировать 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 аннулировать HScroll (UINT nSBCode, UINT НСС );
ON_WM_VSCROLL_REFLECT) afx_msg аннулировать VScroll (UINT nSBCode, UINT НСС );
ON_WM_PARENTNOTIFY_REFLECT) afx_msg аннулировать ParentNotify (UINT сообщение, LPARAM lParam );

ON_NOTIFY_REFLECT и ON_CONTROL_REFLECT макросы иметь вариации, которые позволяют более одного объекта (например, элемент управления и его родителя) для обработки данного сообщения.

Записи карты Прототип функции
ON_NOTIFY_REFLECT_EX ( wNotifyCode, memberFxn ) afx_msg BOOLmemberFxn(NMHDR * pNotifyStruct, LRESULT * результат );
ON_CONTROL_REFLECT_EX ( wNotifyCode, memberFxn ) afx_msg BOOLmemberFxn ( );

Обработка отражен сообщений: Пример элемента управления для повторного использования

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

Для проверки работы этого примера, выполните следующие действия:

  1. Создайте новое диалоговое окно в существующем приложении. Для получения дополнительной информации см. Редактор диалоговых окон в Visual C++ в руководстве пользователя.

    Должен иметь приложение, в котором для разработки повторно используемых элементов управления. Если вы не имеете существующее приложение для использования, создайте диалоговое окно приложением с помощью AppWizard.

  2. С проект в Visual C++, используйте ClassWizard для создания нового класса с именем CYellowEdit на основе CEdit. Оставьте флажок «Добавить компонент галереи».

  3. Добавьте три переменные-члены для вашего CYellowEdit класса. Первые два будет COLORREF переменных для хранения цвет текста и цвет фона. Третий будет объект CBrush , который проведет кисть для рисования на фоне. Объект CBrush позволяет вам для создания кисти, один раз, просто ссылки на него после этого и разрушить кисть автоматически когда CYellowEdit уничтожили управления.

  4. Инициализация переменных-членов, написав в конструктор:
    CYellowEdit::CYellowEdit()
    {
    m_clrText = RGB (0, 0, 0);
    m_clrBkgnd = RGB (255, 255, 0);
    m_brBkgnd.CreateSolidBrush (m_clrBkgnd);
    }
    
  5. С помощью ClassWizard, добавьте обработчик для отраженного сообщения WM_CTLCOLOR для вашего CYellowEdit класса. Обратите внимание, знак равенства за имя сообщения в списке сообщений, которые можно обрабатывать указывает, что сообщение отражает. Это описано в Определение обработчика сообщений для сообщения, отражено в руководство Visual C++ программиста.

    ClassWizard добавляет следующую функцию макро и скелета карты сообщение для вас:

    ON_WM_CTLCOLOR_REFLECT()
    
    / / Примечание: между ними будет другой код....
    
    HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor) {}
    / / TODO: изменить любые атрибуты DC здесь
    
    / / TODO: возвращение кисти не NULL, если
    / / не должен вызываться обработчик родительского элемента
    возвращение NULL;
    }
    
  6. Замените тело функции следующим кодом. Код определяет цвет текста, цвет фона текста и цвет фона для остальной части элемента управления.
    pDC-gt;SetTextColor (m_clrText);    / / текст
    pDC - > SetBkColor (m_clrBkgnd);    / / текст фоновое
    возвращение m_brBkgnd;                / / ctl фоновое
    
  7. Создайте элемент управления редактирования в диалоговом окне вашего, а затем прикрепить его к переменной-члена, дважды щелкните элемент управления edit, удерживая клавишу control. В диалоговом окне Добавление переменной-члена завершите имя переменной и выберите «Управление» для категории, затем «CYellowEdit» для типа переменной. Не забудьте задать порядок табуляции в диалоговом окне. Кроме того, не забудьте включить файл заголовка для CYellowEdit управления в свое диалоговое заголовочном файле.

  8. Постройте и запустите приложение. Элемент управления будет иметь желтый фон.

  9. Теперь можно использовать компонент галерея для добавления вашего CYellowEdit управления класса на другие проекты.

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

Index