2009-06-10 2 views
3

В экземпляре класса, производного от CWnd, возможно ли перенаправить (перенаправить) все сообщения MFC на другой объект, не записывая отдельные обработчики и сопоставления сообщений для каждого возможного сообщения? В частности, я хотел бы переслать все необработанные сообщения WM_ на другой объект. Если это невозможно, можно ли объектам прослушивать события, происходящие внутри других объектов? Я могу сообщить подробности, если это поможет прояснить мой вопрос.Как перенаправить сообщения MFC на другой объект?

Спасибо.

ответ

4

Вам нужно прицелиться чуть ниже МФЦ. Вы должны переопределить метод PreTranslateMessage вашего окна и обработать сообщения напрямую.

Как только у вас есть основной цикл сообщений, вы можете выбрать, какие из них будут обрабатываться вашим приложением, а какие - отправлены/отправлены другому. Если вы решите отправить сообщение, я бы рекомендовал SendMessageTimeout (...)

+0

Thanks; переопределение PreTranslateMessage() было именно тем решением, которое мне было необходимо. – Geoff

+0

Возможно, вы имели в виду PreTranslateMessage? Из комментария Джеффа, похоже, вы это сделали. AFAIK PreProcessMessage - это dotnet. PreTranslateMessage - это функция MFC. Я думаю, что будет полезно отредактировать ответ, чтобы избежать путаницы. –

+0

Спасибо! Сделано редактирование. –

1

Мне кажется, вам нужно подклассы.

+0

Вызов SubclassWindow() не совсем сработал в моей реализации, но я буду помнить об этом для будущего использования. Благодарю. – Geoff

1

Нет, вы не можете делать то, что вы просите, но вы, вероятно, не придется. (Некоторые детали вашей проблемы могут быть в порядке.) Когда вы создаете карту сообщений, вы указываете как класс, к которому он применяется, так и базовый класс для этого класса. Если ваш производный класс не имеет записи карты сообщений для определенного сообщения, MFC проверит карту сообщений для базового класса. Если в карте сообщений базового класса нет записи, она проверит карту сообщений для своего базового класса и так далее.

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

class CMyBaseDialog : public CDialog { 
    DECLARE_MESSAGE_MAP(); 
} 

BEGIN_MESSAGE_MAP(CMyBaseDialog, CDialog) 
    // Handle any common messages here... 
END_MESSAGE_MAP() 

class CDerivedDialog : public CMyBaseDialog { 
    DECLARE_MESSAGE_MAP(); 
} 

BEGIN_MESSAGE_MAP(CDerivedDialog, CMyBaseDialog) 
    // Handle any specific messages here... 
END_MESSAGE_MAP() 

То же самое относится и ко всем другим на основе HWND классов, таких как CWnd, CView, CFrame, и так далее. Если вы имеете дело с командами, то у вас есть дополнительные опции.

0

Ну, так как я не могу оставлять комментарии. Я отправлю это как ответ. У меня возникла проблема после ответа Брэда, где некоторые сообщения WM_COMMANd, которые не маршрутизировались через функцию PreTranslateMessage (см. Мой ответ на мой вопрос How to stop MFC from disabling my controls if I don't declare a message map entry for it's corresponding command?), но прошли через OnCommand, поэтому я в основном переопределяю функцию OnCommand для пересылки всех сообщений WM_COMMAND. Я отправляю это на случай, если у кого-то возникнут проблемы.

В любом случае спасибо за помощь Брэда, ваш ответ мне очень помог.

Смежные вопросы