В моем классе CTreeCtrl я действую на TVN_ITEMEXPANDED:
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, &OnTVNItemExpanded)
В диалоговом окне родительского контроля я также хочу действовать с тем же уведомлением, TVN_ITEMEXPANDED,
ON_NOTIFY(TVN_ITEMEXPANDED, IDC_ELEMENT_TREE, &OnTVNItemExpanded)
Тем не менее, только метод класса OnTVNItemExpanded получает вызов, а не мой диалог. Я использую обе точки останова и видя желаемое поведение (или отсутствие желаемого поведения) в обоих методах, чтобы проверить, что вызывался только метод класса управления, а не мой метод диалога.
НО, если я прокомментирую ON_NOTIFY_REFLECT из моего BEGIN_MESSAGE_MAP, полученного из BEGIN_MESSAGE_MAP
, тогда мой метод диалога BEGIN_MESSAGE_MAP
!?!
Почему уведомление не может попасть в мой контроль и в мой диалог?!?
ON_NOTIFY_REFLECT
переопределяет ON_NOTIFY
, но вместо этого вы можете использовать ON_NOTIFY_REFLECT_EX
который позволяет вашему ON_NOTIFY_REFLECT_EX
вызову решить, должно ли сообщение проходить через родителя или нет.
См. " Отражение сообщений" для Windows Controls для получения более подробного объяснения:
Если в родительском оконном классе вы предоставляете обработчик для определенного сообщения WM_NOTIFY или диапазона сообщений WM_NOTIFY, ваш обработчик будет вызываться только в том случае, если дочерний элемент управления, отправляющий эти сообщения, не имеет обработчика отраженного сообщения через ON_NOTIFY_REFLECT(). Если вы используете ON_NOTIFY_REFLECT_EX() в своей карте сообщений, ваш обработчик сообщений может или не разрешить родительскому окну обрабатывать сообщение. Если обработчик возвращает FALSE, сообщение также будет обрабатываться родителем, а вызов, возвращающий TRUE, не позволяет родителю обрабатывать его. Обратите внимание, что отраженное сообщение обрабатывается перед уведомлением.