VC中自定义SendMessage实现消息传递详解

需积分: 50 7 下载量 166 浏览量 更新于2024-09-11 1 收藏 21KB DOCX 举报
在Microsoft Foundation Classes (MFC) 的开发环境中,了解如何在Visual C++ (VC) 中使用`SendMessage`自定义消息函数是一项重要的技能。`SendMessage`函数允许程序在一个窗口或线程之间传递自定义消息,这是一种常见的通信机制,尤其是在MFC应用程序中实现组件间的协作。 `SendMessage`的基本结构如下: ```cpp SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); ``` - `HWND hWnd` 是消息的目标窗口或线程的句柄,可以是当前窗口的句柄(如`this->m_hWnd`),用于指定接收消息的对象。 - `UINT Msg` 指定了消息类别,它可以是预定义的系统消息(如`WM_CLOSE`、`WM_PAINT`),也可以是开发者自定义的消息(如`WM_MY_DOSOME`或`WM_DOOTHER`)。自定义消息通常通过宏定义来创建,如`#define WM_MY_DOSOME WM_USER+1`。 - `WPARAM wParam` 和 `LPARAM lParam` 是传递给消息处理函数的参数,它们是无符号整型(UINT和WPARAM相同类型)和长整型(LPARAM和LPARAM相同类型),可以用来携带额外的信息。 在发送自定义消息时,首先在发送消息的窗口中调用`SendMessage`,例如: ```cpp ::SendMessage(this->m_hWnd, WM_MY_DOSOME, (WPARAM)0, (LPARAM)0); ``` 接收消息的窗口需要有一个对应的消息处理函数,该函数在`afx_msg`部分定义,如: ```cpp afx_msg LRESULT DoSomeThing(WPARAM iParam1, LPARAM iParam2) { MessageBox("收到消息了,我要开始做一些事情了。", "收到", MB_OK); // 使用iParam1和iParam2进行相应的操作 return 0; } ``` 关键点包括: 1. **afx_msg的使用**:`afx_msg`是一种MFC特定的声明方式,用于将函数声明包含在消息映射(message map)中,使编译器知道它应该处理哪些消息。在头文件中,你需要将处理函数的原型放在`//{{AFX_MSG}}`和`//}}AFX_MSG`之间的注释区域,这使得函数的灰色高亮表示其已注册为响应消息。 2. **消息处理函数的编写**:必须确保消息处理函数的参数类型与`SendMessage`中的参数类型相匹配,并且函数的返回类型通常是`LRESULT`,这是一个通用的结果类型,可以用来封装消息处理的结果。 3. **消息类别与消息处理**:通过`Msg`参数,发送者可以明确指定消息的种类,接收者根据接收到的消息类别(如`WM_MY_DOSOME`)执行相应的处理逻辑。 4. **参数的作用**:`wParam`和`lParam`作为可选参数,允许传递额外的信息,这对于传递状态、数据或者控制信息非常有用。 理解并熟练运用`SendMessage`及其自定义消息功能是MFC编程中的基础,它有助于构建复杂的应用程序架构,实现不同组件间的高效通信。