MFC自定义消息映射
MFC自定义消息映射
本文章适用于刚开始学习mfc的同学进行阅读。如果文章里面由缺陷,希望阅读者能给予批评与指正。谢谢!
正文
MFC的消息映射,运用了STL标准模板库中的map,运用map的一一映射的特性来进行实现的。
先说一下,我之前学习mfc比较懵的位置,就是那个文件我都不知道哪里的操作该写到那个文件里面去。(是不是感觉我很笨笨哒?)
这是我的理解,如果与大家的不同,或者有哪里不对的地方,希望温柔的留言评论~~~
其中MFCApplication1.h,里面主要是对该应用程序进行扩充化,继承了类CWinAPP,只是创建了一个框架,根据要实现的功能,做出对应的操作等。头文件后面+Dlg表示的是这个框架里面该装什么东西。
照这个样子,自定义的消息,还是什么都要在头文件后面+Dlg中进行实现。
读者:你总是说,我咋知道你说的是对的呢?
本人:你感觉,我说的对吗?
读者:我感觉你在瞎啵啵。
本人:好吧,我不瞎啵啵了。
–>让我们验证一下。
点击visual studio的解决方案资源管理器然后找到资源文件中的.rc文件。
容我啵啵一句,.rc文件在resource.h文件打开的情况下是无法正常打开的,关闭resource.h文件即可恢复正常。
心血来潮的来到了UI界面。
然后UI界面就有了两个按钮。鼠标右击按钮,选择添加事件处理程序
当按钮触发了clicked消息,就会调用对应的处理函数。
然后就在这个CMFCApplicationDlg的类中进行实现。
所以,有了这种感觉类后面没有Dlg的为框架区,有Dlg的为客户区。
自定义消息
学过win32的同学们应该明白,Windows都把消息以宏的方式来表现。所以,我们也要在客户区定义宏。
这个宏有以下几点需要注意:
- 它的表示的值必须>0x400,≤0x400的都是系统的消息。如果没有超过这个宏值,你再犟也没用。。。
- 它的宏名必须以WM_的形式开头,当然你也可以随便编。
所以在xxxDlg.h文件中写如下代码:
#define WM_CUTOMMESSAGE (0x400+1)//自定义消息
其次事件处理函数的形式是:afx_msg void 函数名();
然后在这段代码块中进行自定义消息的关联:
BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()//系统的命令行
ON_WM_PAINT().//绘图事件
END_MESSAGE_MAP()
是一个宏函数,使用ON_MESSAGE()来进行关联。
它的具体参数是:
- 自定义消息是什么?
- 这个消息触发之后,让谁来管?
读者:你不废话吗?自定义消息不就是刚刚我们自己定义的消息吗?
作者:我还没说完,你就说我这一会儿说的都是废话。那我不说了。
欣喜之下,同学们这样写的,ON_MESSAGE(WM_CUTOMMESSAGE,&xxxh::test);
开心地点击运行按钮,编译器不正确的报了如下错误:无法将ON_MESSAGE函数中的第二个参数转换为static_cast《LRESULT> test(WPARAM,LPARAM
同学甲:这不就是类型转换导致的错误吗?简单的一批。
呼呼的在xxxDlg.h文件找到对应的函数中修改成以下的方式:
afx_msg LRESULT test(WPARAM w,LPARAM l)
{
AfxMessageBox(_T("这个作者有病,这么简单的东西都该拿到CSDN"));
return 0;
}
END,因为作者被读者喷死,没脸在写了
运行之后,怎么点击没有反应?
惭愧的说:你们比我厉害得多,但我还没说完,你们就开始了。。。
你还要在自己写一个点击按下的事件,才能骂我。
//在那个事件处理块中
ON_BN_CLICKED(按钮ID,&类::sbZuozhe)
afx_msg void sbZuozhe()
{
sendMessage(WM_CUSTOMMESSAGE);
}
在试试吧,同学们的屏幕瞬间把我骂死了。
好,这里的ON_BN_CLICKED是系统的按钮按下宏函数连接
利用这个,现将按钮与一个事件处理代码相关联,然后在这个代码,用SendMessage函数将这个自定义消息发射出去。然后就可以了。
其完整代码为;
xxxDlg.h
#define WM_CUTOMMESSAGE (0x400+1)
//在类中,public属性中:
afx_msg void test1();//用系统事件来管理,顺便发射WM_CUTOMMESSAGE消息。
afx_msg LRESULT test(WPARAM w,LPARAM l);
.cpp
//消息关联区块:
ON_BN_CLICKED(控件ID,&类::test1)
ON_MESSAGE(WM_CUTOMMESSAGE,&类::test)
void xxxDlg::test1()
{
SendMessage(WM_CUTOMMESSAGE);
}
LRESULT xxxDlg::test()
{
AfxMessageBox(_T("终于结束了"));
return 0;
总结:这种方式真的很麻烦,在某些特殊的情况下还无法进行。所以不推荐,大家了解以下即可。
上一篇: 怎么通过ip获取域名?
下一篇: php用递归方法实现无限级分类
推荐阅读
-
钉钉群自定义机器人消息Python封装的实例
-
android自定义view之模拟qq消息拖拽删除效果
-
C#自定义消息函数,需要一个TextBox,一个委托,直接上代码;
-
微信模板消息能自定义? 当然你首先得会这个
-
钉钉群自定义机器人消息Python封装的实例
-
Java中响应结果工具类,可自定义响应码,内容,响应消息
-
js自定义消息机制研究学习(一) ——看百度搜索输入提示
-
C#_Excel数据读取与写入_自定义解析封装类_支持设置标题行位置&使用excel表达式收集数据&单元格映射&标题映射&模板文件的参数数据替换(第二版-增加深度读取和更新功能)
-
Mybatis自定义SQL的关系映射、分页、排序功能的实现
-
Laravel Validator自定义错误返回提示消息并在前端展示