欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MFC自定义消息映射

程序员文章站 2022-06-08 16:04:42
...

MFC自定义消息映射

本文章适用于刚开始学习mfc的同学进行阅读。如果文章里面由缺陷,希望阅读者能给予批评与指正。谢谢!

正文
MFC的消息映射,运用了STL标准模板库中的map,运用map的一一映射的特性来进行实现的。
先说一下,我之前学习mfc比较懵的位置,就是那个文件我都不知道哪里的操作该写到那个文件里面去。(是不是感觉我很笨笨哒?)

这是我的理解,如果与大家的不同,或者有哪里不对的地方,希望温柔的留言评论~~~
MFC自定义消息映射
其中MFCApplication1.h,里面主要是对该应用程序进行扩充化,继承了类CWinAPP,只是创建了一个框架,根据要实现的功能,做出对应的操作等。头文件后面+Dlg表示的是这个框架里面该装什么东西。

照这个样子,自定义的消息,还是什么都要在头文件后面+Dlg中进行实现。

读者:你总是说,我咋知道你说的是对的呢?
本人:你感觉,我说的对吗?
读者:我感觉你在瞎啵啵。
本人:好吧,我不瞎啵啵了。

–>让我们验证一下。

点击visual studio的解决方案资源管理器然后找到资源文件中的.rc文件。
MFC自定义消息映射
容我啵啵一句,.rc文件在resource.h文件打开的情况下是无法正常打开的,关闭resource.h文件即可恢复正常。

心血来潮的来到了UI界面。
MFC自定义消息映射

MFC自定义消息映射
然后UI界面就有了两个按钮。鼠标右击按钮,选择添加事件处理程序
MFC自定义消息映射

当按钮触发了clicked消息,就会调用对应的处理函数。
MFC自定义消息映射

然后就在这个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《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;

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

相关标签: 新手