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