Я прочитал документация, в которой говорится:
ATL поддерживает карты альтернативных сообщений, объявленные с помощью макроса
ALT_MSG_MAP
.
Каждая карта альтернативных сообщений идентифицируется уникальным номером, который вы передаете макросуALT_MSG_MAP
.
Используя карты альтернативных сообщений, вы можете обрабатывать сообщения нескольких окна в одной карте.
Обратите внимание, что по умолчаниюCWindowImpl
не использует альтернативные карты сообщений.
Чтобы добавить эту поддержку, переопределите методWindowProc
в классе, производном отCWindowImpl
, и вызовитеProcessWindowMessage
с картой сообщений. идентификатор.
И когда я смотрю на WTL, я вижу такие карты сообщений, как:
BEGIN_MSG_MAP(CCommandBarCtrlImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
...
ALT_MSG_MAP(1) // Parent window messages
MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
...
ALT_MSG_MAP(2) // MDI client window messages
// Use CMDICommandBarCtrl for MDI support
ALT_MSG_MAP(3) // Message hook messages
MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)
...
END_MSG_MAP()
Однако я не понимаю:
Как их вызывают. (Как код узнает о существовании альтернативных карт сообщений?)
Чем они отличаются от карт сообщений по умолчанию. Все они выглядят так, как будто обрабатывают одни и те же сообщения для одних и тех же окон...
Почему они полезны. (Разве они все равно не для одного и того же окна?)
Есть ли у кого-нибудь лучшее объяснение того, что делают альтернативные карты сообщений?
(Мотивация того, почему они были изобретены, была бы очень полезна.)
ALT_MSG_MAP
выглядит для меня как магическое число, больше нигде не используется) или в чем их смысл. - person user541686   schedule 08.08.2012BEGIN_MSG_MAP
начинает функциюProcessWindowMessage
и открывает оператор switch.ALT_MSG_MAP
добавляет новый случай в оператор switch. В документации дляALT_MSG_MAP
указано, что он используетсяCContainedWindow
, и документация дляCContainedWindow
дает пример. - person Raymond Chen   schedule 08.08.2012CContainedWindow
в WTL, и тем не менее они каким-то образом используютALT_MSG_MAP
: - person user541686   schedule 08.08.2012atlframe.h
(по сути, старой версии WTL), я вижу, чтоCOwnerDraw
используетALT_MSG_MAP(1)
, без следовCContainedWindow
(или любого другого класса) где-либо. Должно быть что-то, чего мне не хватает... - person user541686   schedule 08.08.2012CContainedWindow
, но используютCHAIN_MSG_MAP_ALT
, который также использует альтернативные карты сообщений. - person Raymond Chen   schedule 14.08.2012