SendMessage()在MFC应用程序中不起作用

时间:2014-02-21 06:58:56

标签: c++ mfc sendmessage

我有一个MDI MFC应用程序,我想在CPropertieswnd类中使用SendMessage()来调用CMainFrame类中的函数。自定义消息定义为:

#define WM_CUSTOM (WM_APP + 10)

Mainframe.cpp中的消息映射是:

ON_COMMAND(WM_CUSTOM , &CMainFrame::OnFileNewType1)    

在Propertieswnd.cpp文件中发送消息:

AfxGetMainWnd()->SendMessage(WM_CUSTOM);

但是从未调用过OnFileNewType1()函数。任何人都可以指导我错过哪一点吗?

3 个答案:

答案 0 :(得分:4)

您必须使用ON_MESSAGE处理程序来处理消息。

ON_MESSAGE

该函数应在CMainFrame中声明如下:

afx_msg LRESULT OnFileNewType1(WPARAM wParam, LPARAM lParam);

答案 1 :(得分: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的详细信息,以便您也可以使用它们。

答案 2 :(得分:1)

如果要模仿选择菜单项或单击工具栏按钮的行为并使用相同的代码选择菜单项并发送自己的命令,则可以使用已有的处理程序。您只需要修复SendMessage的参数。

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

所有菜单项点击,加速器等都会转换为WM_COMMAND消息,然后通过系统路由到您的ON_COMMAND处理程序。如果你想搭载该系统,你也需要发送WM_COMMAND消息。如果没有,你需要像其他人建议的那样走ON_MESSAGE的路线。

有关WM_COMMAND及其wParam和lParam参数的详细信息,请参阅here