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


TN062. Отражение сообщений для элементов управления окнами

Примечание

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

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

Это техническом примечании обсуждаются отражение сообщения, как оно применяется к ранее называемых элементами управления ActiveX (элементами управления OLE). См. Элементы управления ActiveX. Создание подкласса для элемента управления Windows статьи.

Отражение, что сообщения?

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

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

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

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

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

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

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

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

Макрос для сопоставления сообщений отраженных сообщений немного отличается от для обычных уведомлений: он содержит _REFLECT, добавленный к обычному его имени. Например, для обработки сообщение 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_NOTIFYON_NOTIFY_REFLECT.

  • Макрос для отражений ON_UPDATE_COMMAND_UION_UPDATE_COMMAND_UI_REFLECT.

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

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

Запись сопоставления

Прототип функции

ON_CONTROL_REFLECT( , memberFxn )wNotifyCode

void afx_msg memberFxn ( );

ON_NOTIFY_REFLECT( , memberFxn )wNotifyCode

результат );pNotifyStruct, LRESULT* (NMHDR * void afx_msg memberFxn

)ON_UPDATE_COMMAND_UI_REFLECT( memberFxn

void afx_msg memberFxn (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 пустое (LPDELETEITEMSTRUCT DeleteItem 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 nPos );

ON_WM_VSCROLL_REFLECT ()

afx_msg пустое VScroll (UINT nSBCode, UINT nPos );

ON_WM_PARENTNOTIFY_REFLECT ()

afx_msg пустое ParentNotify (UINT messageLPARAM, lParam );

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

Запись сопоставления

Прототип функции

ON_NOTIFY_REFLECT_EX( , memberFxn )wNotifyCode

результат );pNotifyStruct, LRESULT* (NMHDR * afx_msg BOOL memberFxn

ON_CONTROL_REFLECT_EX( , memberFxn )wNotifyCode

afx_msg BOOL memberFxn ( );

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

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

Затем пример создает элемент управления, повторно

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

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

  2. После создания проекта, загруженный в Visual C++, используйте ClassWizard, чтобы создать новый класс с именем CYellowEdit на основе CEdit.

  3. Добавьте переменную-член 3 к классу CYellowEdit. Первые 2 будут переменными 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. Обратите внимание, что знак равенства перед именем сообщения в списке сообщений можно обработать означает, что сообщение будет отображаться. Это описано в разделе Определение обработчика сообщений для отраженных сообщений.

    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;
    }
    
  6. Замените текст функции следующим кодом. Код определяет цвет фона текста, цвет текста и цвет фона для остальной части элемента управления.

       pDC->SetTextColor( m_clrText );   // text
       pDC->SetBkColor( m_clrBkgnd );   // text bkgnd
       return m_brBkgnd;            // ctl bkgnd
    
  7. Создание элемента управления "Поле ввода" в диалоговом окне, а затем вложите его в переменные-члену, дважды щелкнув элемент управления "Поле ввода" при удержащ нажмите стрелку вниз. В диалоговом окне добавления переменной-члена, введите имя переменной и выберите «элемент управления» для категории, затем «CYellowEdit» для типа переменной. Не забудьте задать последовательность табуляции в диалоговом окне. Кроме того, необходимо включить файл заголовка для управления CYellowEdit в файле заголовка диалогового окна.

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

См. также

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

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

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