MFC编程过程中如何发出和接收自己定义的消息

当涉及单文档或多文档视图或多个窗口编程时,如果每个对话框之间需要一定的控制联系,较好的方法就是自己定义的消息,然后在对话框中分发出去,主框架根据不同消息响应不同的操作。下面的例程为单文档视图,实现自定义消息的分发与响应如下:

一、定义自己的消息:

注意:定义消息的值最好大于等于 (WM_USER+100),因为在区间 [WM_USER, (WM_USER+100)] 中很多值可能已经被使用,为防止冲突,最好采用大于(WM_USER+100)的部分。

   WM_USER: 为了防止用户定义的消息ID与系统的消息ID冲突,MS定义这个宏,小于WM_USER的ID被系统使用,大于WM_USER的ID被系统使用。
// MainFrm.h : CMainFrame 类的接口
//
#pragma once
 
#define COMMAND_A (WM_USER+100)
#define COMMAND_B (WM_USER+101)
#define COMMAND_C (WM_USER+102)
#define COMMAND_D (WM_USER+103)
#define COMMAND_E (WM_USER+104)

二、在主框架中搭建处理消息的函数:

(1)在框架类中声明函数:

private:
afx_msg LRESULT OnMyCommand(WPARAM wParam, LPARAM lParam);
(2)将消息与响应函数进行捆绑:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()

ON_MESSAGE(COMMAND_A, OnMyCommand)
ON_MESSAGE(COMMAND_B, OnMyCommand)
ON_MESSAGE(COMMAND_C, OnMyCommand)
ON_MESSAGE(COMMAND_D, OnMyCommand)
ON_MESSAGE(COMMAND_E, OnMyCommand)

END_MESSAGE_MAP()
(3)定义自己的消息响应函数:

注意:参数wParam即为自己定义的消息宏,lParam可用可不用,更具实际情况而定。

LRESULT CMainFrame::OnMyCommand(WPARAM wParam, LPARAM lParam)
{
//	CCreateContext *pContext = new CCreateContext;
 
	switch (wParam)
	{
	case COMMAND_A:
		break;
	case COMMAND_B:
		break;
	case COMMAND_C:
		break;
	case COMMAND_D:
		break;
	case COMMAND_E:
		break;
	}	
 
	return LRESULT();
}

三、分发消息:

分发消息比较简单,准确调用APIPostMessage即可,代码如下:

::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), COMMAND_A, (WPARAM)COMMAND_A, (LPARAM)0);

注意:有时候会出现在某个文件中MFC发送消息发送不出去的情况,但是在别的文件可以,这可能是主对话框的句柄获取的问题,可以改成AfxGetApp()->GetMainWnd()->GetSafeHwnd()获取主窗口句柄。

猜你喜欢

转载自blog.csdn.net/qq_23350817/article/details/103629918