2014-02-21 3 views
0

У меня есть приложение MDI MFC, где я хочу использовать SendMessage() из класса CPropertieswnd для вызова функции в классе CMainFrame. Обычай сообщение определяется как:SendMessage() не работает в приложении MFC

#define WM_CUSTOM (WM_APP + 10) 

messagemap в Mainframe.cpp является:

ON_COMMAND(WM_CUSTOM , &CMainFrame::OnFileNewType1)  

В Propertieswnd.cpp файл отправляется сообщение:

AfxGetMainWnd()->SendMessage(WM_CUSTOM); 

Но OnFileNewType1 () функция никогда не вызывалась. Может кто-нибудь, пожалуйста, назовите меня, в какой точке я пропал?

ответ

4

Для обработки сообщения необходимо использовать обработчик ON_MESSAGE.

ON_MESSAGE

Функция должна быть объявлена ​​следующим образом внутри CMainFrame:

afx_msg LRESULT OnFileNewType1(WPARAM wParam, LPARAM lParam);

1

Вам необходимы два шага для обработки пользовательского сообщения, которое вы создаете. 1) Создайте функцию обработчика сообщений. 2) Сопоставьте его с вашим пользовательским сообщением.

Для примера.

#define WM_CUSTOM WM+10 

Пусть ваше сообщение функции обработчика (часть вашего класса) выглядит следующим образом

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 

Карта вашего сообщения и обработчика сообщений в BEGIN_MESSAGE_MAP

BEGIN_MESSAGE_MAP(CMyWnd2, CWnd) 
    ON_MESSAGE(WM_CUSTOM , OnMyMessage) 
END_MESSAGE_MAP() 

Теперь, когда

AfxGetMainWnd()->SendMessage(WM_CUSTOM); 

. функция обработчика сообщений OnMyMessage будет вызвана. Вы можете написать свой код в этом методе.

Подробнее о деталях WPARAM и LPARAM, чтобы вы могли их использовать.

1

Если вы хотите подражать поведению выбора элемента меню или нажатию кнопки на панели инструментов и использовать тот же код для выбора пункта меню и отправки собственных команд, вы можете использовать обработчик, который у вас уже есть. Вам просто нужно исправить аргументы вашего SendMessage.

AfxGetMainWnd()->SendMessage(WM_COMMAND, WM_CUSTOM, 0); 

Все щелчки пункт меню, акселераторы и такие, переводятся в сообщения WM_COMMAND, затем направляется через систему для вызова обработчиков ON_COMMAND. Если вы хотите скомпоновать эту систему, вам также нужно отправить сообщения WM_COMMAND. Если нет, вам нужно пройти маршрут ON_MESSAGE, как предложили другие.

Для получения более подробной информации о WM_COMMAND и аргументах wParam и lParam см. here.

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