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


Обработчики для стандартных сообщений Windows

Обработчики по умолчанию для стандартных сообщений Windows (WM_) предопределяются в классе CWnd. Библиотека классов основывает имена этих обработчиков в имени сообщения. Например, обработчик сообщения WM_PAINT объявляется как CWnd :

afx_msg void OnPaint();

Afx_msg ключевое слово предлагает эффект ключевое слово C++ virtual , различая обработчики от других CWnd функций-членов. Обратите внимание, что эти функции на самом деле не являются виртуальными; Вместо этого они реализуются с помощью карт сообщений. Карты сообщений зависят исключительно от стандартных макросов препроцессора, а не от расширений языка C++. Afx_msg ключевое слово разрешается в пробел после предварительной обработки.

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

В некоторых случаях обработчик должен вызывать переопределенный обработчик в базовом классе, чтобы базовый класс (es) и Windows могли работать с сообщением. При вызове обработчика базового класса в переопределении зависит от обстоятельств. Иногда необходимо сначала вызывать обработчик базового класса, а иногда и последний. Иногда обработчик базового класса вызывается условно, если вы решили не обрабатывать сообщение самостоятельно. Иногда следует вызвать обработчик базового класса, а затем условно выполнить собственный код обработчика в зависимости от значения или состояния, возвращаемого обработчиком базового класса.

Внимание

Небезопасно изменить аргументы, переданные в обработчик, если вы планируете передать их обработчику базового класса. Например, может потребоваться изменить аргумент nChar обработчика OnChar (например, преобразовать в верхний регистр). Это поведение довольно неясно, но если вам нужно выполнить этот эффект, используйте CWnd функцию-член SendMessage вместо этого.

Как определить правильный способ переопределения заданного сообщения, когда мастер классов записывает скелет функции обработчика для данного сообщения — OnCreate обработчик для WM_CREATE, например, он нарисовывается в виде рекомендуемой переопределенной функции-члена. В следующем примере обработчик рекомендует сначала вызвать обработчик базового класса и продолжить только при условии, что он не возвращает -1.

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (CFormView::OnCreate(lpCreateStruct) == -1)
      return -1;

   // TODO:  Add your specialized creation code here

   return 0;
}

По соглашению имена этих обработчиков начинаются с префикса "Вкл.". Некоторые из этих обработчиков не принимают никаких аргументов, а другие принимают несколько. Некоторые также имеют тип возвращаемого значения, отличный от voidтипа. Обработчики по умолчанию для всех сообщений WM_ документируются в справочнике MFC как члены функций классаCWnd, имена которых начинаются с "Вкл.". Объявления функций-членов в CWnd префиксируются afx_msg.

См. также

Объявление функций обработчиков сообщений