学习一下如何自定义Windows MFC消息

来源:互联网 发布:linux 开启ssh 编辑:程序博客网 时间:2024/04/26 05:33

我们先看看Visual C++ studio(以下简称VC) 给我们生成的怎么生成的代码

示例:
我们新建一个基于单文档[SDI]的MFC程序(比如取工程名为Test)
在calss view中选择CTestView类 单击右键选择 Add Windows Message Handle...
我们随便选择一个消息 点击 Add and Edit (这里我们选择WM_PAINT消息)
这样 我们就进入了消息函数的内部 在此处编辑代码 我们就 可以再用户(或者程序)触发此消息的时候 执行我们
所编写的代码 实现预期的功能

我们仔细观察可以发现 VC帮我们添加了如下代码:

1.在头文件中 给我们添加了 afx_msg void OnPaint() 消息处理函数函数定义
此函数定义被添加在//{{AFX_MSG(CLesson3View)和//}}AFX_MSG之间【注:以AFX 开头的函数和变量一般都是系统预定义的全局函数或者变量(个人理解)】,这2个事注释宏 加在他们之间的一般是由系统产生的消息处理函数
形如:
//{{AFX_MSG(CLesson3View)
afx_msg void OnPaint();
//}}AFX_MSG

2.在源文件中,给我们添加了(红色标记部分)
BEGIN_MESSAGE_MAP(CLesson3View, CView)
 //{{AFX_MSG_MAP(CLesson3View)
 ON_WM_PAINT()
END_MESSAGE_MAP()

3.还有就是源文件中的此函数的代码实现段


通过这样 我们就能理解VC是怎样将消息和其处理函数相关联的了

比如 我们想处理自己定义的一个消息,以下是我的实现步骤:(如果有问题 请见谅)

首先 我们在工程的Resources.h文件中添加自己的一个消息(此处消息定义为UM_TEST)如
#define UM_TEST    111

然后在CView的头文件中添加afx_msg void OnTest();注意 将此定义放在END_MESSAGE_MAP()后面( DECLARE_MESSAGE_MAP()前面)
,此处是定义消息处理函数,afx_msg 说明此函数是消息处理函数
再到源文件中添加ON_MESSAGE(UM_TEST,OnTest);将此放在BEGIN_MESSAGE_MAP(CLesson3View, CView)和END_MESSAGE_MAP()之间
此处是将消息与其处理函数相关联
然后在此源文件中写此消息的处理 如:
void CFFFView::OnTest(){
 MessageBox("OnTest");
}

当我们要想发送此消息时 就调用SendMessage函数发送消息 SendMessage(UM_TEST)
如我们先给CView中添加WM_LBUTTONDOWN消息 然后在消息处理函数中调用SendMessage(UM_TEST)
这样每次 我们在程序的客户区中点击鼠标左键是 就会出现一个消息框