Как перенаправить сообщения MFC на другой объект? - PullRequest
3 голосов
/ 11 июня 2009

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

Спасибо.

Ответы [ 4 ]

4 голосов
/ 11 июня 2009

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

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

1 голос
/ 11 июня 2009

Нет, вы не можете делать то, что просите, но вам, вероятно, не нужно. (Некоторые подробности вашей проблемы могут быть в порядке.) При создании карты сообщений вы указываете и класс, к которому оно применяется, и базовый класс для этого класса. Если ваш производный класс не имеет записи карты сообщений для определенного сообщения, 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 и так далее. Если вы имеете дело с командными сообщениями, у вас есть несколько дополнительных опций.

1 голос
/ 11 июня 2009

Я думаю, вам нужно подклассы .

0 голосов
/ 03 октября 2009

Ну, так как я не могу написать комментарий, я опубликую это как ответ. У меня возникла проблема после ответа Брэда, когда некоторые сообщения WM_COMMANd не были направлены через функцию PreTranslateMessage (см. Мой ответ на мой вопрос Как запретить MFC отключать мои элементы управления, если я не объявляю запись карты сообщений для соответствующей команды ? ) но были через OnCommand, поэтому я переопределил функцию OnCommand для пересылки всех сообщений WM_COMMAND. Я публикую это на тот случай, если у кого-то возникнет такая же проблема.

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

...