在MFC中,发送并处理自定义消息

本文介绍在Windows95应用程序中如何自定义消息及其实现步骤,包括定义消息、实现处理函数、声明函数和使用宏指令进行消息映射。
第一步:定义消息。开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。 

第二步:实现消息处理函数。该函数使用WPRAM 和 LPARAM 参数并返回LPESULT。 

LPESULT   CMainFrame::OnMyMessage(WPARAM   wParam,   LPARAM   lParam) 

//   TODO:   处理用户自定义消息 
  ... 
  return   0; 

第三步:在类头文件的AFX_MSG块中说明消息处理函数: 

class   CMainFrame:public   CMDIFrameWnd 

... 
//   一般消息映射函数 
protected: 
//   {{AFX_MSG(CMainFrame) 
afx_msg   int   OnCreate(LPCREATESTRUCT   lpCreateStruct); 
afx_msg   void   OnTimer(UINT   nIDEvent); 
afx_msg   LRESULT   OnMyMessage(WPARAM   wParam,   LPARAM   lParam); 
//}}AFX_MSG 
DECLARE_MESSAGE_MAP() 

第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。 

BEGIN_MESSAGE_MAP(CMainFrame,   CMDIFrameWnd) 
//{{AFX_MSG_MAP(CMainFrame) 
ON_WM_CREATE() 
ON_WM_TIMER() 
ON_MESSAGE(WM_MY_MESSAGE,   OnMyMessage) 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
<think>我们正在处理一个关于MFC编程的问题:如何在自定义类中向主窗口发送自定义消息。根据用户需求,我们需要提供方法或代码示例。参考提供的引用内容:引用[1]提到:普通Windows消息用户自定义消息只能放到CFrameWndCView等派生与CWnd中的类中处理。引用[2]展示了如何在自定义类(派生自CWnd)中处理控件消息(通过消息映射),包含一个控件指针。用户需求:自定义类(可能不是窗口类)向主窗口(通常是框架窗口)发送自定义消息。步骤:1.定义自定义消息。通常使用WM_USER以上的值。2.在主窗口类(如CFrameWnd派生类)中添加消息映射,实现消息处理函数。3.在自定义类中获取主窗口的指针(或通过参数传入),然后使用SendMessage或PostMessage发送消息。注意:如果自定义类不是窗口类(即不是从CWnd派生),则不能使用消息映射来处理消息,但可以发送消息到其他窗口(如主窗口)。我们将提供示例代码:示例:假设主窗口类为CMainFrame,自定义类为CMyCustomClass(可能是一个非窗口类,比如一个工作类)。步骤1:定义自定义消息在stdafx.h或某个头文件中定义消息:```cpp#defineWM_MY_CUSTOM_MESSAGE(WM_USER+100)```步骤2:在主窗口类中声明实现消息处理函数,添加消息映射。在MainFrm.h中:```cppclassCMainFrame:publicCFrameWnd{protected:afx_msgLRESULTOnMyCustomMessage(WPARAMwParam,LPARAMlParam);DECLARE_MESSAGE_MAP()};```在MainFrm.cpp中:```cppBEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_MESSAGE(WM_MY_CUSTOM_MESSAGE,&CMainFrame::OnMyCustomMessage)END_MESSAGE_MAP()LRESULTCMainFrame::OnMyCustomMessage(WPARAMwParam,LPARAMlParam){//处理自定义消息//可以在这里根据wParamlParam进行相应的操作AfxMessageBox(_T("接收到自定义消息!"));return0;}```步骤3:在自定义类中发送消息。在自定义类中,我们需要有指向主窗口的指针。可以通过构造函数传入,或者通过AfxGetMainWnd()获取。例如,在CMyCustomClass中:```cppvoidCMyCustomClass::SomeFunction(){//获取主窗口指针CWnd*pMainWnd=AfxGetMainWnd();if(pMainWnd){//发送消息pMainWnd->SendMessage(WM_MY_CUSTOM_MESSAGE,0,0);//或者使用PostMessage//pMainWnd->PostMessage(WM_MY_CUSTOM_MESSAGE,0,0);}}```注意:如果自定义类是在工作线程中,那么使用AfxGetMainWnd()可能不是线程安全的,建议在创建自定义类时将主窗口指针传入。如果自定义类是在主线程中创建的,那么使用AfxGetMainWnd()是安全的。另一种情况:如果自定义类是从CWnd派生的(比如一个自定义控件),那么它可以直接使用GetParent()等方法获取父窗口(可能是主窗口),然后发送消息。总结:1.定义自定义消息。2.在主窗口类中添加消息处理函数映射。3.在自定义类中获取主窗口指针发送消息。相关问题:1.如何定义自定义消息?2.MFC中SendMessagePostMessage有什么区别?3.如何在多线程中安全地向主窗口发送消息?</think>### MFC自定义类向主窗口发送自定义消息的方法 在MFC中实现自定义类向主窗口发送自定义消息,需要完成以下核心步骤: #### 1. **定义自定义消息** 在`stdafx.h`中定义消息ID(值需大于`WM_USER`): ```cpp #define WM_MY_CUSTOM_MESSAGE (WM_USER + 100) ``` #### 2. **主窗口声明消息处理函数** 在框架窗口类头文件(如`MainFrm.h`)中: ```cpp class CMainFrame : public CFrameWnd { public: afx_msg LRESULT OnMyCustomMessage(WPARAM wParam, LPARAM lParam); // 声明处理函数 DECLARE_MESSAGE_MAP() }; ``` #### 3. **主窗口实现消息映射** 在`MainFrm.cpp`中添加: ```cpp BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_MESSAGE(WM_MY_CUSTOM_MESSAGE, &CMainFrame::OnMyCustomMessage) // 映射消息 END_MESSAGE_MAP() // 消息处理函数实现 LRESULT CMainFrame::OnMyCustomMessage(WPARAM wParam, LPARAM lParam) { CString strMsg; strMsg.Format(L"收到消息! 参数: %d, %d", wParam, lParam); AfxMessageBox(strMsg); return 0; } ``` #### 4. **自定义发送消息** 在自定义类中获取主窗口指针发送消息: ```cpp // 自定义类方法示例 void CMyCustomClass::SendCustomMessage() { CWnd* pMainWnd = AfxGetMainWnd(); // 获取主窗口指针 if (pMainWnd) { // 发送消息(阻塞方式) pMainWnd->SendMessage(WM_MY_CUSTOM_MESSAGE, 123, 456); // 或投递消息(非阻塞方式) // pMainWnd->PostMessage(WM_MY_CUSTOM_MESSAGE, 123, 456); } } ``` #### 关键点说明 1. **消息接收限制** 只有派生自`CWnd`的类(如`CFrameWnd`、`CView`)才能接收自定义消息[^1]。 2. **线程安全** 跨线程通信时需使用`PostThreadMessage`或自定义消息队列。 3. **参数传递** 通过`WPARAM``LPARAM`传递整型数据,复杂数据需传递指针(注意生命周期管理)。 4. **消息类型选择** - `SendMessage()`:同步调用,等待处理完成 - `PostMessage()`:异步调用,立即返回 #### 完整调用流程 ```mermaid graph LR A[自定义类] -->|1. 获取主窗口指针| B[AfxGetMainWnd] B -->|2. 发送消息| C[SendMessage/PostMessage] C -->|3. 消息路由| D[主窗口消息映射] D -->|4. 触发| E[OnMyCustomMessage处理函数] ``` [^1]: MFC中普通Windows消息用户自定义消息只能由`CWnd`派生类处理,这是MFC消息路由机制的核心限制。 [^2]: 通过`AfxGetMainWnd()`获取框架窗口指针是跨模块通信的常用方法,但需注意线程上下文。 --- ### 相关问题 1. **如何在非窗口类(如文档类)中接收自定义消息?** [提示:需通过中间窗口类转发] 2. **跨线程发送自定义消息时需要注意什么?** [提示:线程同步消息队列管理] 3. **如何通过自定义消息传递复杂数据结构(如结构体)?** [提示:动态内存分配WM_COPYDATA消息] 4. **MFC消息映射机制与Windows原生消息处理有何本质区别?** [提示:宏展开消息路由表]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值