MFC定时器原理
mfc工作原理

mfc工作原理
MFC,即Microsoft Foundation Classes,是一种用于开发Windows图形用户界面(GUI)应用程序的编程框架。
其工作
原理可以简要概括如下:
1. MFC是基于面向对象的编程方法,它使用C++语言来实现
应用程序的开发。
开发者在MFC中创建一系列的类,每个类
分别表示应用程序的窗口、控件、消息处理等各个方面。
2. MFC提供了一组丰富的类和函数库,用于快速构建各种窗
口和控件。
通过继承和复用MFC提供的基础类,开发者可以
很轻松地创建自己的应用程序。
3. MFC使用了消息机制处理用户输入和操作系统事件。
当用
户在应用程序中进行操作时(如点击按钮、键盘输入等),系统会生成相应的消息,MFC会根据消息类型和目标窗口的消
息映射表来调用相应的消息处理函数。
4. MFC以响应式编程的形式工作,即通过处理不同的消息来
响应用户的操作。
开发者可以重写或扩展MFC提供的默认消
息处理函数,以实现自定义的应用逻辑。
5. MFC还提供了一些其他功能,如多线程支持、数据库连接、文件操作等。
开发者可以利用这些功能来开发更加复杂和完善的应用程序。
总之,MFC通过提供一套面向对象的框架和一系列工具类,
帮助开发者快速构建Windows图形界面应用程序。
它通过消息机制来处理用户操作,通过类的继承和复用来提高代码的可维护性和可扩展性。
plc定时器的工作原理

plc定时器的工作原理PLC定时器是工业自动化控制系统中常用的一种设备,它的工作原理是通过控制输入信号和运算逻辑来实现定时功能。
本文将从定时器的基本原理、工作方式和应用领域等方面进行详细介绍。
一、定时器的基本原理PLC定时器是一种基于时序控制的装置,它的主要功能是按照预设的时间参数进行计时,并在满足条件时输出控制信号。
定时器一般由计数器和比较器组成,其中计数器用于计时,比较器用于比较计数器的值与预设的时间参数。
定时器的计数器可以根据不同的需求选择不同的计时单位,常见的有毫秒、秒、分钟等。
比较器通常与计数器相连,当计数器的值与预设的时间参数相等时,比较器会输出一个信号,触发相应的操作。
二、定时器的工作方式PLC定时器可以分为两种工作方式:基于触发和基于间隔。
1. 基于触发的定时器基于触发的定时器是指在接收到触发信号后开始计时,当计时器的值达到预设的时间参数时,触发器会输出一个控制信号。
这种定时器常用于需要根据外部事件触发的应用场景,如按下按钮后延时启动某个设备。
2. 基于间隔的定时器基于间隔的定时器是指定时器按照设定的时间间隔进行计时,当计时器的值达到预设的时间参数时,触发器会输出一个控制信号。
这种定时器常用于需要定时执行某些任务的应用场景,如定时检测设备状态、定时采集数据等。
三、定时器的应用领域PLC定时器广泛应用于工业自动化控制系统中,其应用领域包括但不限于以下几个方面:1. 生产线控制在生产线控制中,定时器常用于控制机械设备的启停时间,以及产品在各个工位的停留时间。
通过合理设置定时器的参数,可以实现生产线的自动化控制,提高生产效率。
2. 温度控制在温度控制系统中,定时器常用于控制加热设备的工作时间。
通过定时器的计时功能,可以实现定时开启或关闭加热设备,从而控制温度在设定范围内波动,保持恒温效果。
3. 照明控制在照明控制系统中,定时器常用于控制灯光的开关时间。
通过定时器的计时功能,可以按照预设的时间参数自动开启或关闭灯光,实现节能环保的效果。
VC++实验七MFC定时器编程实验

VC++实验七MFC定时器编程实验实验七MFC 定时器编程实验一、预备知识1、定时器消息定时器时间到时,向窗口发送WM_TIMER 消息,应用程序窗口通过处理该消息来对定时器事件进行处理,该消息的参数说明如下:WM_TIMERwTimerID = wParam; // 定时器标识符tmprc = (TIMERPROC *) lParam; // 定时器回调函数的地址其中,定时器回调函数在使用SetTimer 启动定时器时指定,如果没有指定定时器回调函数则可直接通过消息映射处理WM_TIMER 消息。
2、启动定时器使用SetTimer 函数创建一个定时器,并制定超时时间,然后启动定时器。
该函数说明如下:UINT SetTimer(UINT nIDEvent, // 定时器标识符UINT nElapse, // 定时时间,单位是毫秒void (CALLBACK EXPORT* lpfnTimer) // 定时器回调函数地址(HWND, UINT, UINT, DWORD));示例代码:SetTimer(1,200,NULL);3、销毁定时器定时器在不使用时要使用KillTimer 函数进行销毁,该函数说明如下:BOOL KillTimer(int nIDEvent // 定时器标识符);示例代码:KillTimer(1);二、实验目的(1) 掌握Visual Studio 开发环境调试程序的方法;(2) 熟练使用类向导进行消息映射;(3) 掌握MFC 编程模式中定时器的使用方法。
三、实验内容设计一个窗口,在窗口中间位置绘制一个红色粗实线的矩形,并用交替使用三种不同样式的画刷填充矩形的内部,每次刷新的时间间隔为1.0 秒。
单击鼠标左键启动定时器,单击鼠标右键停止定时器。
四、编程实验部分程序及运行结果(1) 列出定时器操作相关的程序清单1、WM_PAINT消息的处理//OnPaint()函数实现用自定义画笔绘制一个矩形//并调用相应的画刷填充图形内部void CDemoDlg::OnPaint(){CPaintDC dc(this);CPen Pen, *pOldPen;CBrush Brush;Pen.CreatePen(PS_SOLID, 6, RGB(255, 0, 0));//m_nStyle用于选择不同的画刷填充图形内部switch (m_nStyle){case 0:Brush.CreateSolidBrush(RGB(0,0,255));break;case 1:Brush.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 255));break;case 2:Brush.CreateSolidBrush(RGB(0, 255, 0));break;default:break;}pOldPen = dc.SelectObject(&Pen);dc.SelectObject(&Brush);dc.Rectangle(100, 50, 450, 260);dc.SelectObject(pOldPen);}2、WM_LBUTTONDOWN消息的处理//当按下鼠标左键时启动定时器void CDemoDlg::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值SetTimer(1, 1000, NULL);CDialog::OnLButtonDown(nFlags, point);}3、WM_RBUTTONDOWN消息的处理//当按下鼠标右键是取消定时器void CDemoDlg::OnRButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值KillTimer(1);CDialog::OnRButtonDown(nFlags, point);}4、WM_Timer消息的处理//当按下鼠标右键是取消定时器void CDemoDlg::OnRButtonDown(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值KillTimer(1);CDialog::OnRButtonDown(nFlags, point);}//定时器消息处理函数void CDemoDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值//判断m_nStyle的值,实现用不同颜色的画刷填充图形if (m_nStyle < 2){m_nStyle++;}else{m_nStyle = 0;}//刷新图形InvalidateRect(NULL);CDialog::OnTimer(nIDEvent);}5、实验结果五、实验总结(1) 总结定时器消息编程的步骤,以及程序设计过程中需要注意的问题定时器消息WM_TIMER消息:消息号:WM_TIMER字参数:wParam ==》定时器标识长字参数:(TIMERPROC *) lParam==》定时器回调函数地址CWnd::SetTimer()功能:设置定时器UINT SetTimer(UINT nIDEvent, // 定时器标识符UINT nElapse,void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD));CWnd ::KillTimer()功能:销毁定时器BOOL KillTimer(int nIDEvent // 定时器标识符);消息映射:1、消息映射宏ON_MESSAGE(WM_TIMER,OnTimer)2、消息处理函数声明LRESULT OnTimer(WPARAM wParam,LPARAM lParam) ;3、消息处理函数实现LRESULT CDrawWnd::OnTimer(WPARAM wParam, LPARAM lParam){return 0;}(2) 总结实验的心得体会,实验中遇到的困难以及解决的方法等通过本次实验编程,我学习掌握了从类向导中直接添加消息映射的步骤和方法,了解到通过类向导可以直接在项目中直接添加消息映射,添加处理函数,添加命令,添加成员变量等,使用类向导为我们的编程带来了许许多多的方便,省去了手动添加消息映射,添加成员函数的麻烦。
C++MFC中定时器的使用

C++MFC中定时器的使用C++ MFC中定时器的使用用处:定时重绘,形成动态波形图。
如温度曲线。
思路:与单片机定时器中断一样,先打开定时器再把执行的代码写进编译器生成的CMy56Dlg::OnTimer(UINT nIDEvent)函数中。
其中 nIDEvent 中的n代表定时器的编号;通常与switch-case语句构成多个定时器的同时使用。
步骤:一.通过类向导在对话框基类中添加OnTimer子类。
步骤:【查看】-【类向导】-【Messagemaps】-【CMy**Dlg】-【message】-【WM_timer】编译后CMyDlg类此时会自动添加一个OnTimer(UI NT nIDEvent)子类。
并添加一个响应函数void CMy56Dlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call d efaultCDialog::OnTimer(nIDEvent);//这句话编译器自动添加,看样子是判断第几个定时器触发的响应。
貌似可以删掉。
}二.到此就可以使用定时器了。
使用方法:首先执行SetTimer(UINT nIDEvent,timer,NULL);其中UINT nIDEvent是定时器编号,需自己设定想用定时器1就设为1。
雷同于单片机的定时器1和2。
timer是uint型,表示定时时间,单位为ms.NULL保留。
然后添加中断函数如下:void CMy56Dlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call d efaultCDialog::OnTimer(nIDEvent);}三:例子假定用的是定时器一,定时1s:1.【查看】-【类向导】-【Messagemaps】-【CMy**Dlg】-【message】-【WM_timer】并编译2.开启定时器:SetTimer(1,1000,NULL);//定时器一,定时一秒。
mfc延时函数

mfc延时函数MFC(Microsoft Foundation Class)是在Windows平台下编写应用程序的一种基础类库。
在MFC中,我们常常需要使用延时函数来控制程序运行的时间,以此达到某些特定的目的。
本文将从三个方面来讲述MFC延时函数的使用。
一、Sleep函数Sleep函数是Windows系统提供的一种延时函数,也是MFC中最常用的延时函数之一。
它的参数为等待时间,单位为毫秒。
可以通过Sleep 函数来实现持续一定时间的等待。
例如,我们可以通过以下代码来实现等待1秒钟的功能:```Sleep(1000);```其中1000表示等待时间为1000毫秒(即1秒钟)。
需要注意的是,Sleep函数会将当前线程挂起,也就是说,当前线程将无法执行其他操作,直到延时时间结束才会被重新唤醒。
二、OnTimer函数OnTimer函数是MFC消息机制中一个比较常用的函数,它可以实现定时器的功能。
通过定时器,我们可以实现在一定时间段内反复执行某些操作,例如定时更新UI界面、定时采集传感器数据等等。
要实现定时器功能,我们需要在MFC消息函数中添加以下代码:```SetTimer(nIDEvent, nElapse, NULL);```其中nIDEvent为定时器ID,nElapse为定时周期,单位为毫秒,NULL 为定时器处理函数,如果不需要处理函数可以传入NULL。
接下来,我们需要在消息函数中添加以下代码:```void CDialogExExampleDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值if (nIDEvent == 1) //定时器ID{//定时器处理函数内容}CDialogEx::OnTimer(nIDEvent);```其中,OnTimer函数中nIDEvent为定时器ID,需要与SetTimer函数中的nIDEvent对应,以便程序能够识别定时器并执行相应的操作。
mfc工作原理

mfc工作原理MFC(Microsoft Foundation Classes)是微软公司开发的一套用于Windows操作系统的应用程序框架,它在C++语言的基础上封装了一些常用的图形用户界面(GUI)功能,简化了Windows应用程序的开发过程。
本文将围绕MFC的工作原理展开阐述。
MFC的工作原理主要包括以下几个方面:1. 类库结构:MFC是一个面向对象的类库,它由一系列C++类组成。
这些类封装了Windows API的功能,提供了一种更加便捷的方式来创建和管理Windows应用程序。
MFC的类库结构包含了一些基本的类,如CObject、CWnd和CFrameWnd等,以及一些用于界面设计的类,如CButton、CEdit和CListBox等。
2. 消息映射机制:在MFC中,窗口类派生自CWnd类,通过消息映射机制来处理用户输入、系统消息等事件。
当用户操作窗口时,例如点击按钮、拖动滚动条等,系统会生成相应的消息,MFC会将这些消息映射到窗口类的成员函数上进行处理。
开发者只需重载对应的成员函数,就可以实现自定义的响应逻辑。
3. 对话框和控件:MFC提供了对话框和控件的封装,使得开发者可以方便地创建和管理用户界面。
对话框是一个独立的窗口,可以包含各种控件,如按钮、文本框、列表框等。
开发者可以使用MFC 提供的类来创建和设置对话框及其控件,通过消息映射机制来处理用户操作。
4. 文档视图模型(Document-View模式):MFC采用了文档视图模型来处理应用程序的数据和界面显示。
开发者可以通过MFC提供的类来创建文档类和视图类,文档类用于管理应用程序的数据,视图类用于显示和编辑数据。
MFC会自动处理文档和视图之间的关联,使得数据的修改能够实时反映到界面上。
5. 消息循环:MFC应用程序在启动后会进入一个消息循环,不断地接收和处理消息。
消息循环负责分发消息,并将消息传递给对应的窗口类进行处理。
MFC提供了一个消息映射表,用于将消息和相应的处理函数关联起来。
CMFC中定时器的使用

CMFC中定时器的使用MFC(Microsoft Foundation Class)是一套面向Windows平台的C++类库,它简化了Windows API的使用,并提供了一些常用的界面和功能组件。
MFC中的定时器允许开发人员在应用程序中设置一定的时间间隔,以执行特定的任务或更新界面。
本文将详细介绍MFC中定时器的使用方法。
在MFC中,定时器的创建和管理是通过CWnd类来实现的。
CWnd类是MFC中所有窗口类的基类,它封装了一些与窗口有关的函数和属性。
首先,需要在窗口类的头文件中添加响应的定时器消息映射:```cppclass CMyWnd : public CWndDECLARE_MESSAGE_MAPafx_msg void OnTimer(UINT_PTR nIDEvent);};```然后,在窗口类的源文件中添加消息映射的处理函数:```cppBEGIN_MESSAGE_MAP(CMyWnd, CWnd)ON_WM_TIMEREND_MESSAGE_MAPvoid CMyWnd::OnTimer(UINT_PTR nIDEvent)switch (nIDEvent)case 1://处理定时器1的逻辑break;case 2://处理定时器2的逻辑break;default:break;}CWnd::OnTimer(nIDEvent);```在窗口类的构造函数中,可以通过调用CWnd类的SetTimer函数来创建定时器:```cppCMyWnd::CMyWndSetTimer(1, 1000, NULL); // 创建ID为1的定时器,时间间隔为1000msSetTimer(2, 2000, NULL); // 创建ID为2的定时器,时间间隔为2000ms```在窗口类的析构函数中,需要调用CWnd类的KillTimer函数来销毁定时器:```cppCMyWnd::~CMyWndKillTimer(1); // 销毁ID为1的定时器KillTimer(2); // 销毁ID为2的定时器```通过上述代码,我们可以在窗口类中创建和管理多个定时器,并且可以在OnTimer函数中根据定时器的ID来处理相应的逻辑。
MFC 定时器的使用

MFC 定时器的使用点击连接(按住Ctrl点击)最近遇到关于定时器的使用问题,在网上也搜索了很多相关资料。
其中都是讲了使用SetTimer 和KillTimer具体的介绍大家可以看看这个连接:/jax_lee/article/details/6774711里面讲的比较详细的。
但是由于自己不是很了解怎样使用,就是说在那里添加SetTimer()和KillTimer()所以尝试也是失败了好几次。
经过摸索终于成功了,现在和大家分享一下,相互学习。
我的是基于对话框的工程,于是在OnInitDialog()里面添加定时器BOOL CMonitorProcessDlg::OnInitDialog(){SetTimer(1,3000,NULL); //第一个参数可以自己设置是定时器的ID,第二个参数是间隔时间(毫秒为单位的)}当然别忘记添加WM_TIMER消息OnTimer()然后我定义了2个全局变量int nPress = 0; //用于联合判断“启动”按钮的按下状态BOOL bStatic = FALSE; //用于判断程序是否在执行,以便KillTimer()例如按下按钮之后,显示“”void CMonitorProcessDlg::OnBnClickedButtonStart(){MessageBox(" ");nPress++;bStatic = TRUE;}在OnTimer()函数里面添加代码。
void CMonitorProcessDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值if (nIDEvent ==1 && nPress ==1){OnBnClickedButtonStart();nPress --;}if (bStatic == TRUE){KillTimer(1);}CDialog::OnTimer(nIDEvent);}上面只是一个简单的演示,希望对大家有帮助吧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mfc42UD.lib MfcO42D.lib MfcD42D.lib Nafxcw.lib NafxcwD.lib gdi32.lib user32.lib kernel32.lib msvcrt.lib msvcrtd.lib libcmt.lib libc.lib
MFCxxUD.DLL的导入函数库(Unicode Debug版) MFCOxxD.DLL的导入函数库(OLE Debug版) MFCDxxD.DLL的导入函数库(Database Debug版) MFC静态链接库(Release版) MFC静态链接库(Debug版) GDI32.DLL的导入函数库 USER32.DLL的导入函数库 KERNEL32.DLL的导入函数库 MSVCRT.DLL(C运行函数库)的导入函数库 MSVCRTD.DLL(Debug版C运行函数库)的导入函数库 C运行函数静态链接库(多线程) C运行函数静态链接库(单线程)
6.3.1 应用程序框架中的对象
MFC应用程序框架提供了构建应用程序所需要 的类,在程序运行时能够生成运行时类的对象, 如代表应用程序对象、文档对象、视图对象和 框架窗口对象。应用程序对象theApp是一个唯 一的全局变量,它的主要功能是通过调用 WinMain()主函数启动程序的运行。 MFC应用程序框架也有一个作为程序入口点的 WinMain()主函数,但在源程序中看不见该函 数,它在MFC中已定义好并同应用程序相链接。
ClassWizard在类的定义中声明了消息处理函数 : 在类的定义中声明了消息处理函数
class CMainFrame : CFrameWnd { public: CMainFrame(); protected: //{{AFX_MSG(CMainFrame) // 声明消息处理函数原形 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // 由程序向导自动生成 afx_msg void OnClose(); // 由ClassWizard类向导添加 afx_msg void OnDestroy(); afx_msg void OnEditCopy(); //}}AFX_MSG DECLARE_MESSAGE_MAP() // 声明使用消息映射宏 };
6.2.3 学习 学习MFC的方法 的方法
首先要对Windows编程概念和API函数有一定的了解,如 Windows API有哪些功能和哪些常用的数据结构等。 学会抽象地把握问题,不求甚解,不要一开始学习Visual C++就试图了解整个MFC类库。从理解和使用两个方面学 习MFC,理解MFC应用程序的框架结构。 先大体上了解MFC的概念、组成和基本约定,从简单的类 入手,结合程序设计,由浅入深,循序渐进、日积月累。 编程时如果MFC某个类能完成所需要的功能,可以直接调 用已有类的方法(成员函数)。否则,可以利用面向对象 技术中的“继承”方法对MFC类的行为进行扩充和修改, 从MFC中已有的类派生出自己需要的类。 学习MFC,另一点就是不要过分依赖于向导(Wizard)工 具。向导能做许多工作,但同时掩饰了太多的细节。
采用MFC编程的优点: 编程的优点: 采用 编程的优点 使用标准化的程序代码结构,有利于程序员之 间的交流。 Visual C++为MFC提供了大量的工具支持,提高 了编程效率。如利用MFC AppWizard创建MFC 应 用 程 序 框 架 , 利 用 ClassWizard 方 便 地 对 Windows消息进行管理。 MFC 应 用 程 序 的 效 率 较 高 , 只 比 传 统 的 Windows C程序低5%左右。并且,在MFC应用 程序中还允许混合使用传统的Windows API函数。 其它优势:完全支持Windows所有的函数、控件、 消息、菜单及对话框;具有良好的稳定性和可 移植性,更符合微软的风格等。
6.2.2 MFC体系结构 体系结构 MFC主要组成部分:类、宏和全局函数。 类是MFC中最主要的内容。MFC类是以层次结 构方式组织起来的。MFC中的类分成两部分,除 了一些辅助类,大多数的MFC类是直接或间接从 根类CObject派生而来。 几乎每一个派生层次都与一具体的Windows实例 相对应,如文档类、窗口类和视图类等。 MFC宏主要功能:消息映射、运行时对象类型服 务、诊断服务、异常处理。 MFC约定:全局函数以“Afx”为前缀,全局变量 以“afx”为前缀。
6.2 MFC微软基础类 微软基础类
利用Windows API开发程序的用户有这样的体 会,即使开发一个简单的Windows应用程序也需要 对Windows的编程原理有很深刻的认识,需要手工 编写冗长的代码。由于程序的出错率是随着代码长 度的增加呈几何级数增长的,而且当程序长度逐渐 膨胀时,调试程序会变得越来越困难。因此,传统 的Windows应用程序设计需要程序员有极大的耐心 和丰富的编程经验。 Visual C++捆绑了微软的基础类MFC,编程时 我们就可以利用类的可重用性和可扩充性,大大降 低Windows应用程序设计的难度和工作量。
MFC应用程序对象之间的关系 应用程序对象之间的关系
6.3.2 MFC应用程序的生与死 应用程序的生与死
在MFC应用程序的CWinApp派生类对象theApp是一个全局 变量,代表了应用程序运行的主线程。它在程序整个运行 期间都存在,它的销毁意味着运行程序的消亡。 MFC应用程序启动时,首先创建应用程序对象theApp,这 时将自动调用应用程序类的构造函数初始化对象theApp, 然后由应用程序框架调用MFC提供的AfxWinMain()主函数。 AfxWinMain()主函数首先通过调用全局函数AfxGetApp()获 取应用程序对象theApp的指针pApp,然后通过pApp调用应 用程序对象的有关成员函数,完成程序的初始化和启动工 作,最后调用成员函数Run(),进入消息循环。 程序运行后将收到WM_PAINT消息,调用OnPaint()函数绘 制客户区窗口。如果Run()收到WM_QUIT消息,则结束消 息循环,然后调用函数ExitInstance(),结束程序运行。
MFC应用程序运行后各函数的调用关源自 应用程序运行后各函数的调用关系InitInstance()函数是派生类唯一需要重载的函数,它负 责应用程序的初始化,如初始化数据、创建文档模板、处理 命令行以及显示应用程序主窗口。
6.3.3 常用的 常用的MFC文件和库文件 文件和库文件
文件名称 afxwin.h afxext.h afxdisp.h afxdtctl.h afxcmn.h Mfc42.lib Mfc42D.lib MfcS42.lib MfcS42D.lib Mfc42U.lib 声明MFC核心类 MFC扩展文件,声明工具栏、状态栏、拆分窗口等类 声明OLE类 声明支持IE 4公用控件的MFC类,如CImageList等 声明Windows公共控件类 MFCxx.DLL的导入函数库(Release版) MFCxx.DLL的导入函数库(Debug版) MFCSxx.DLL的导入函数库(Static Release版) MFCSxxD.DLL的导入函数库(Static Debug版) MFCxxU.DLL的导入函数库(Unicode Release版) 说 明
6.2.1 MFC概述 概述
类库是一个可以在应用程序中使用的相互关联的 C++类的集合。 MFC作为一个Windows编程类库, 它包含了200多个类,封装了Windows的大部分编 程对象以及与它们有关的操作。 虽然程序在功能上千差万别,但从本质上看,都 可以分为用户界面设计、文件操作、数据库访问 及多媒体使用等几部分,这些都可以通过一些类 来实现。MFC提供了一个标准化的程序结构,使 开发人员不必从头设计一个Windows应用程序。 MFC实际上是一个庞大的文件库,它由几百个执 行文件和源代码文件(如H文件)组成。
6.4.2 消息的发送
发送消息到一个窗口可以采用传送(Send)或寄 送(Post)方式,这两种方式之间的主要区别是消 息被接收对象收到后是否立即被处理。Windows提 供了三个API函数用于消息的发送。 函数SendMessage()用于向一个或多个窗口传送消 息,该函数将调用目标窗口的窗口函数,直到目 标窗口处理完收到的消息,该函数才返回。 函数PostMessage()用于向一个或多个窗口寄送消息, 它把消息放在指定窗口创建的线程的消息队列中, 然后不等消息处理完就返回。
6.4 MFC消息管理 消息管理
MFC消息管理是MFC编程的一个重要内容,也是 编写MFC应用程序的基础。 MFC应用程序消息处理的方式与SDK应用程序有所 不同。MFC应用程序框架截取了Windows向应用程 序发出的消息,再确定将消息发送给哪一个对象, 可以根据需要利用函数重载对消息进行处理,但不 需要处理的消息将由应用程序框架自动处理。 消息管理包括消息的发送和处理。对于消息发送, MFC提供了类似于API函数功能的消息发送函数, 而MFC消息处理的内部机制则相对复杂一些。从编 程的角度出发,我们只需了解其大致的原理。
6.4.1 MFC消息映射机制 消息映射机制
MFC采用 消息映射 ( Message Map) 机制取代 ) C/C++语言中的switch-case结构来处理消息。 MFC消息映射机制包括一组消息映射宏 消息映射宏。一条消 消息映射宏 息映射宏把一个Windows消息和其消息处理函数 联结起来。 MFC应用程序框架提供了消息映射功能。 在类的实现源文件中用BEGIN_MESSAGE_MAP() 和END_MESSAGE_MAP()宏来定义消息映射。 在类定义的结尾用DECLARE_MESSAGE_MAP() 宏来声明使用消息映射。
MFC应用程序 应用程序MESSAGE_MAP消息映射形式: 消息映射形式: 应用程序 消息映射形式 BEGIN_MESSAGE_MAP(theclass, baseclass) //{{AFX_MSG_MAP(theclass) ON_ . . . . . . // MFC预定义的消息映射宏 // 用户自定义的消息映射宏 . . . . . . //}}AFX_MSG_MAP END_MESSAGE_MAP()