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()来进行关联。

它的具体参数是:

  1. 自定义消息是什么?
  2. 这个消息触发之后,让谁来管?

欣喜之下,同学们这样写的,ON_MESSAGE(WM_CUTOMMESSAGE,&xxxh::test);

开心地点击运行按钮,编译器不正确的报了如下错误:无法将ON_MESSAGE函数中的第二个参数转换为static_cast test(WPARAM,LPARAM

呼呼的在xxxDlg.h文件找到对应的函数中修改成以下的方式:

afx_msg LRESULT test(WPARAM w,LPARAM l)
{
	AfxMessageBox(_T("这个作者有病,这么简单的东西都该拿到CSDN"));
	return 0;
}

//在那个事件处理块中
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;

总结:这种方式真的很麻烦,在某些特殊的情况下还无法进行。所以不推荐,大家了解以下即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值