模仿MFC消息驱动机制
欢迎向我索要模仿MFC消息驱动的实例源码,希望能与更多的人讨论。
邮箱:wjh_2010@163.com
在微软推出的MFC架构中,其消息驱动机制是其精髓,使用简单,效率高,而且思路清晰。如果能够模拟MFC的消息驱动机制,并添加一些自己的消息映射(例如消息可以用字符串表示),那么在程序的移植上就会有非常大的帮助。
1.MFC消息的基本使用规则
A.定义自己的类,派生于CWnd,
B.在类的内部声明DECLARE_MESSAGE_MAP()
C.定义消息映射表:
BEGIN_MESSAGE_MAP(CChildView,CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
分析这三个宏的定义,即可发现其消息映射表的实现规则(宏的定义请直接参考VS的工程)。
一个类的消息映射表的框图如下:

由于DECLARE_MESSAGE_MAP()声明的函数为虚函数,所以基类获得的消息映射表是最上层的映射表。在消息派发的时候,就可以先在子类的消息映射表中查找,查找不到再交给其基类处理,这样一直往底层派发。
2.实现MFC消息架构的基本原理
在C/C++中,基本上好的程序架构都离不开回调函数。MFC的消息架构也是如此,不过在C++中有虚函数的概念。因为回调函数能够解决模块间的耦合问题。
在MFC中定义消息映射的宏很多,例如ON_MESSAGE。每个消息映射都有一个类的成员函数,这函数就是回调函数。底层调用这些回调函数的时候能够实现像用对象调用这些函数一样,在函数中直接使用this指针。
MFC中,不同的消息映射,其实现的回调函数参数不一样。
实现MFC的消息架构需要实现的基本点如下:
A.回调函数调用类的成员函数,函数内部使用this指针;
B.根据不同的消息类型,给回调函数传入不同的参数;
C.对象的注册与注销,可能在消息函数中释放对象;
D.消息队列的处理与派发消息过程;
E.消息函数的重入问题;
对于A、B两点,在MFC的消息架构中可以看到其源码,可以参考消息映射宏的实现与CWnd::OnWndMsg函数的实现。
对于问题C,可以在基类的构造函数中实现注册,在析构函数中实现注销,对于对象的释放做出规定。
对于问题D,在消息队列中获得的消息,首先需要找到目标对象,然后再目标对象中查找对应的消息映射表,调用相应的回调函数。
在CWnd::OnWndMsg中如下语句说明了如何查找消息映射表。
for(/*pMessageMapalreadyinit'ed*/;pMessageMap->pfnGetBaseMap!=NULL;
pMessageMap=(*pMessageMap->pfnGetBaseMap)())
3.模拟MFC消息驱动机制
在MFC的消息机制中,一般在窗口类中实现消息的收发。自定义的类若不是派生于CWnd,则无法实现消息映射。并且发送消息必须有hwnd句柄(类对象直接调用send等函数则省略了该参数)。并且其消息映射只能使用整型数字,无法使用字符串来标志消息类型。
我们希望模拟MFC的消息机制,并扩展MFC的消息机制,实现如下功能:
A.定义整型的消息映射表
B.定义字符型的消息映射表
C.可以广播消息
D.可以通过对象名,而不单使用对象关联句柄发送消息。
定义带消息驱动的类:
classCCmdParser:publicCMsgBase
CCmdParser:类为自定义类,派生于CMsgBase即可实现消息映射。
CMsgBase:是所有消息类的基类,其构造函数和析构函数会实现对象的注册与注销。
如果CCmdParser需要实现自己的消息映射表,则在类中声明
//声明消息映射表
DECLARE_MFH_MESSAGE_MAP()
然后在类的实现中声明映射表:
//消息映射表
BEGIN_MFH_MESSAGE_MAP(CCmdParser,CMsgBase)
MFH_COMMAND("SLOGIN",&CCmdParser::DealLoginCommand)
MFH_COMMAND("SStartFileTransmit",&CCmdParser::DealLoginCommand)
MFH_BOARDCAST(MSG_CHECK_USER,&CCmdParser::DealCheckUser)
MFH_MESSAGE(MSG_START_SERVER,&CCmdParser::StartServer)
END_MFH_MESSAGE_MAP()
主程序的使用如下:
int_tmain(intargc,_TCHAR*argv[])
{
CCmdParser
parser;
parser.PostUserMessage(MSG_START_SERVER,NULL,NULL);
returnCMsgBase::Exec();
}
在模拟消息机制中主要需要实现sendMessage,PostMessage类似的函数和消息循环Exec()函数。
分享到:
相关推荐
为了模仿Qt的信号槽机制,我们需要创建一个类似的消息映射系统,允许我们更加灵活地连接和断开事件处理器。 在Qt中,信号是当特定事件发生时由对象发出的通知,而槽是响应这些通知的函数。在MFC中,我们可以使用...
本项目"商业编程-源码-模仿MFC中的CAsyncSocket类"显然是一个旨在理解和学习如何基于CAsyncSocket进行网络编程的实践案例。 首先,CAsyncSocket类是MFC对Windows Socket API(Winsock)的封装,它提供了更友好的C++...
学习MFC,你需要了解基本的C++类、对象和继承概念,同时掌握如何创建和管理Windows窗口、消息处理和事件驱动编程。 2. **创建MFC应用程序框架** 开始项目时,你将在Visual Studio中选择MFC应用程序向导,生成一个...
3. **事件处理**:了解MFC事件驱动编程,编写消息映射函数处理用户交互,例如点击按钮触发播放、暂停等操作。 4. **GDI+图形绘制**:可能涉及到GDI+库来实现酷狗音乐特有的动画效果,比如歌曲切换时的过渡动画、...
在这个项目中,MFC为我们提供了窗口、控件、消息处理等基础设施,使得我们可以专注于计算器的具体逻辑实现,而不是底层的窗口管理和事件处理。 其次,计算器的核心是其算法和逻辑。在这个版本中,算法经过了多次...
7. **事件驱动编程**:MFC使用事件驱动模型,当用户进行操作时,如点击按钮,会产生相应的消息,程序通过消息队列接收并处理这些消息,执行相应的功能。 8. **网络通信**:虽然这个项目主要关注界面,但考虑到QQ...
6. **事件驱动编程**:MFC是事件驱动的,用户在界面上的操作会触发特定的消息,程序通过消息映射机制响应这些消息。例如,点击“保存”按钮会触发一个消息,程序需要处理这个消息以执行保存操作。 7. **异常处理**...
在MFC中,构建一个类似IDE的界面需要使用对话框(CDialog)、控件(CButton、CEdit等)以及消息映射机制。通过这个例子,你可以学习到如何设计复杂的用户界面,以及如何处理用户输入和响应各种事件。 4. **...
10. **事件驱动编程(Event-driven Programming)**:MFC是基于事件驱动模型的,理解这一编程模式对正确处理用户交互至关重要。 总之,通过研究"MFC QQ界面代码",开发者不仅可以提升MFC编程技能,还能学习到如何...
1. **消息机制**:MFC是基于Windows消息驱动的,控件的事件通过消息映射函数来处理。开发者需要在消息映射类中定义响应特定消息的函数,例如WM_CREATE、WM_PAINT等,然后在函数内编写处理逻辑。 2. **控件自绘**:...
MFC采用消息映射机制来处理窗口消息。开发者需要在头文件中声明消息映射,并在源文件中实现它们。例如,处理鼠标点击事件可能需要添加`ON_WM_LBUTTONDOWN`到消息映射,然后在类中实现对应的处理函数。 7. **多态性...
5. **消息映射机制**:MFC使用消息映射来处理窗口消息,将消息ID映射到相应的成员函数,简化了消息处理过程。 6. **应用框架类**:如CWinApp,它是应用程序的主要入口点,管理整个应用程序的生命周期。 在描述中...
5. **事件处理**:MFC采用消息驱动的机制,通过消息映射函数处理用户的输入事件,如点击按钮、拖动滑块等。开发者需要编写相应的响应函数,实现音乐播放、暂停、停止、上一曲、下一曲等操作。 6. **多线程**:为了...
MFC通过消息映射机制将消息分发给相应的成员函数处理,实现功能逻辑。 ### 7. 文件BOARD 压缩包中的"BOARD"可能是程序的源代码文件或编译后的可执行文件。如果是源代码,可能包含了主窗口类、消息处理函数、剪贴板...
4. **事件驱动编程**:MFC 使用消息映射机制处理用户交互。当用户点击按钮时,对应的按钮消息会被发送,然后由消息映射函数处理这些消息,执行相应的计算操作。 5. **基本数学运算**:计算器的核心在于实现各种数学...
在本文中,我们将深入探讨"MFC任务管理器实例",这是一个基于Microsoft Foundation Class (MFC)库构建的应用程序,旨在模仿Windows操作系统中的任务管理器功能。MFC是Microsoft为Visual C++开发的一个类库,它提供了...
3. **MFC框架与消息映射的C++仿真**:4个学时,学生需模仿MFC,使用API和C++构建包含消息映射的程序框架,深化对MFC框架结构的理解。 4. **Windows绘图程序**:4个学时,学生将利用SDI或MDI开发类似Windows画图程序...
此外,事件驱动编程是MFC的核心,通过消息映射机制响应用户的操作。 【标签】中的"10086"暗示这个项目可能模仿了中国移动的服务流程,而"MFC"则明确了项目使用的编程技术。 综上所述,这个项目是一个综合性的MFC...
1. **消息映射**:MFC通过消息映射机制来处理用户操作。每个控件都有对应的WM_COMMAND消息,通过ON_BN_CLICKED等宏将消息映射到相应的成员函数,处理用户的点击事件。 2. **事件驱动编程**:当用户与界面交互时,如...
4. **消息映射**:MFC使用消息映射机制来处理用户的输入事件,如点击按钮、输入文字等。你需要在头文件中声明消息映射,并在实现文件中定义相应的函数。 5. **数据结构**:用于存储牌的信息,可以创建一个包含花色...