MFC定时器原理

合集下载

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定时器是一种基于时序控制的装置,它的主要功能是按照预设的时间参数进行计时,并在满足条件时输出控制信号。

定时器一般由计数器和比较器组成,其中计数器用于计时,比较器用于比较计数器的值与预设的时间参数。

定时器的计数器可以根据不同的需求选择不同的计时单位,常见的有毫秒、秒、分钟等。

比较器通常与计数器相连,当计数器的值与预设的时间参数相等时,比较器会输出一个信号,触发相应的操作。

二、定时器的工作方式PLC定时器可以分为两种工作方式:基于触发和基于间隔。

1. 基于触发的定时器基于触发的定时器是指在接收到触发信号后开始计时,当计时器的值达到预设的时间参数时,触发器会输出一个控制信号。

这种定时器常用于需要根据外部事件触发的应用场景,如按下按钮后延时启动某个设备。

2. 基于间隔的定时器基于间隔的定时器是指定时器按照设定的时间间隔进行计时,当计时器的值达到预设的时间参数时,触发器会输出一个控制信号。

这种定时器常用于需要定时执行某些任务的应用场景,如定时检测设备状态、定时采集数据等。

三、定时器的应用领域PLC定时器广泛应用于工业自动化控制系统中,其应用领域包括但不限于以下几个方面:1. 生产线控制在生产线控制中,定时器常用于控制机械设备的启停时间,以及产品在各个工位的停留时间。

通过合理设置定时器的参数,可以实现生产线的自动化控制,提高生产效率。

2. 温度控制在温度控制系统中,定时器常用于控制加热设备的工作时间。

通过定时器的计时功能,可以实现定时开启或关闭加热设备,从而控制温度在设定范围内波动,保持恒温效果。

3. 照明控制在照明控制系统中,定时器常用于控制灯光的开关时间。

通过定时器的计时功能,可以按照预设的时间参数自动开启或关闭灯光,实现节能环保的效果。

VC++实验七MFC定时器编程实验

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中定时器的使用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延时函数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工作原理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中定时器的使用

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 定时器的使用

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);}上面只是一个简单的演示,希望对大家有帮助吧。

timer 实现原理

timer 实现原理

timer 实现原理一、定时器的概念和作用定时器是计算机系统中的一种工具,用于在指定的时间间隔内执行特定的任务或操作。

它可以帮助我们实现定时任务、定时提醒、定时控制等功能。

定时器在各个领域都有广泛的应用,比如操作系统中的任务调度、网络通信中的超时处理、嵌入式系统中的定时中断等。

二、定时器的实现原理1. 软件定时器软件定时器是通过软件实现的定时功能。

它利用计算机系统的时钟来计算时间间隔,然后在特定的时间点触发相应的事件。

软件定时器的实现方式较为简单,但精度较低,受到系统负载等因素的影响较大。

2. 硬件定时器硬件定时器是通过硬件电路实现的定时功能。

它通常由计时器、计数器和中断控制器等组成。

硬件定时器的计时精度较高,不受系统负载的影响,可以实现更精确的定时功能。

三、常见的定时器实现方式1. 延时循环延时循环是最简单的定时器实现方式。

通过在程序中设置一个循环,使程序在指定的时间间隔内暂停执行。

这种方式适用于简单的定时操作,但不适用于需要同时执行其他任务的场景,因为延时循环会阻塞程序的执行。

2. 多线程定时器多线程定时器是通过创建一个独立的线程来实现定时功能。

该线程负责计时和触发相应的事件。

多线程定时器适用于需要同时执行多个定时任务的场景,可以提高程序的并发性和响应性。

3. 中断定时器中断定时器是通过硬件中断信号来实现定时功能。

当计时器达到设定的时间间隔时,触发一个中断信号,通知处理器执行相应的中断服务程序。

中断定时器可以实现高精度的定时功能,适用于对时间精度要求较高的场景。

四、定时器的应用场景定时器在各个领域都有广泛的应用。

下面介绍几个常见的应用场景:1. 操作系统中的任务调度操作系统通过定时器来实现任务调度,按照一定的时间间隔轮流执行各个任务,保证每个任务都能得到执行的机会。

2. 网络通信中的超时处理在网络通信中,定时器常用于检测数据包的超时情况。

如果在指定的时间内没有收到对方的响应,就会触发超时处理,进行相应的重传或错误处理。

论文资料-第7章 MFC原理与方法new

论文资料-第7章 MFC原理与方法new
所谓消息就是用于描述某个事件发生的信息,而事件是对于Windows的某种操作。 事件和消息密切相关,事件是因,消息是果,事件产生消息,消息对应事件。所谓消息的响应,其实质就是事件的响应。 消息驱动是Windows应用程序的核心,所有的外部响应〔如键盘、鼠标和计时器等〕都被Windows先拦截,转换成消息后再发送到应用程序中的目标对象,应用程序根据消息的具体内容进行处理。 消息不仅可由Windows发出,它也可由应用程序本身或其它程序产生。Windows为每一个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成一个队列。
MFC应用程序MESSAGE_MAP消息映射形式:
注意:特殊注解“//{{AFX_MSG_MAP〞是ClassWizard类向导用于维护消息映射宏的标记,用户不要删除注解轻易修改注解内的代码。
启动ClassWizard,添加要求的三个消息处理函数,ClassWizard将在类的实现文件中添加三个消息映射宏和消息处理函数。消息映射宏如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() // 由MFC AppWizard程序向导自动生成的消息映射 ON_WM_CLOSE() // 由ClassWizard类向导添加 ON_WM_DESTROY() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) //}}AFX_MSG_MAP END_MESSAGE_MAP()
7.1.3 事件和消息
消息队列和在应用程序中的轮询处理
Windows消息分为三种类型:
标准Windows消息:以WM_前缀〔但不包括WM_COMMAND〕开始的消息,包括鼠标消息、键盘消息和窗口消息,如WM_MOVE 、WM_PAINT等。 控件通知〔Control Notification〕消息:对控件操作引起的消息,是控件和子窗口向其父窗口发出的WM_COMMAND通知消息。例如,当用户修改了编辑控件中的文本后,编辑控件向其父窗口发送WM_COMMAND通知消息。 命令〔Command〕消息:由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。命令消息与其它消息不同,它可被更广泛的的对象如文档、文档模板、应用程序对象、窗口和视图等处理。

MFC定时的用法

MFC定时的用法

VC 中的定时VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作。

方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。

首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。

然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。

这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为18ms。

CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。

只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。

方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。

精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。

方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。

以下是实现2秒的延时代码:COleDateTime start_time = COleDateTime::GetCurrentTime();COleDateTimeSpan end_time= COleDateTime::GetCurrentTime()-start_time;while(end_time.GetTotalSeconds()< 2) //实现延时2秒{MSG msg;GetMessage(&msg,NULL,0,0);TranslateMessage(&msg);DispatchMessage(&msg);//以上四行是实现在延时或定时期间能处理其他的消息,//虽然这样可以降低CPU的占有率,//但降低了延时或定时精度,实际应用中可以去掉。

MFC原理与方法

MFC原理与方法

MFC原理与方法MFC(Microsoft Foundation Class)是微软为Windows操作系统开发的一套应用程序框架,它是Windows平台下的一种较为成熟的应用程序开发的方法。

MFC提供了一系列常用的类和函数,用于简化程序的开发过程,并提供了丰富的界面组件和控件,帮助开发者更快速地构建Windows应用程序。

MFC的原理是基于Windows操作系统的事件驱动模型。

在Windows中,应用程序通过处理消息来与操作系统进行交互。

MFC框架提供了一些基类,如CWnd类和CFrameWnd类,这些类继承了Windows操作系统的窗口类,并封装了一些常用的功能和方法。

开发者可以通过继承这些类来创建自己的窗口应用程序,并重载相应的消息处理函数来处理不同的消息。

以一个简单的窗口应用程序为例,首先需要定义一个继承自CFrameWnd的类,在该类中重载相应的消息处理函数。

然后在应用程序的入口函数中,通过调用AfxWinInit函数来初始化MFC框架,创建主窗口,并进入消息循环。

在消息循环中,MFC框架会负责不断接收并分发消息,同时调用相应的消息处理函数来处理不同的消息。

当用户点击窗口中的按钮或输入文本时,MFC框架会将相应的消息发送给应用程序,并调用对应的消息处理函数来进行处理。

MFC框架提供了多种方法来创建和管理控件,使得开发者可以方便地控制和定制应用程序的界面。

例如,通过使用CButton类和CStatic类,可以在窗口中添加按钮和静态文本控件。

通过调用相应的方法,可以设置控件的位置、大小、文本等属性,并注册相应的事件处理函数来响应用户的操作。

此外,MFC框架还提供了对话框类(CDialog)和菜单类(CMenu)等,用于创建对话框和添加菜单,进一步增强了应用程序的交互性。

除了提供界面组件和控件,MFC框架还提供了一些常用的方法和类,用于实现应用程序的功能。

例如,通过CFile类和CArchive类,可以方便地进行文件的读写操作。

mfc timer用法

mfc timer用法

mfc timer用法MFC(Microsoft Foundation Classes)是一个C++的框架,用于开发Windows应用程序。

MFC提供了一系列的类和函数,其中包含了一个计时器类CTimer,用于定时触发特定的动作。

使用MFC的计时器,需要按照以下步骤进行操作:1. 在需要使用计时器的类的头文件中,包含`afxwin.h`和`afxext.h`头文件。

```#include <afxwin.h>#include <afxext.h>```2. 在类中声明计时器对象。

```CTimer m_timer;```3. 在类的构造函数中,进行计时器的初始化设置。

```m_timer.SetInterval(1000); // 设置计时器触发的时间间隔,单位为毫秒m_timer.StartTimer(); // 启动计时器```4. 在需要处理计时器触发事件的地方,添加相应的消息处理函数。

```afx_msg void OnTimer(UINT_PTR nIDEvent); // 声明消息处理函数DECLARE_MESSAGE_MAP() // 声明消息映射```5. 在消息处理函数中添加具体的处理逻辑。

```void CMyClass::OnTimer(UINT_PTR nIDEvent){if (nIDEvent == m_timer.GetTimerID()){// 处理计时器触发事件的逻辑}else{// 处理其他计时器触发事件的逻辑}}```6. 在类的实现文件中,使用`ON_WM_TIMER()`宏来指定消息映射。

```BEGIN_MESSAGE_MAP(CMyClass, CWnd)ON_WM_TIMER()END_MESSAGE_MAP()```通过以上步骤,就可以在MFC应用程序中使用计时器实现定时触发特定的动作了。

VS2010_MFC编程入门之四十四(MFC常用类:定时器Timer)-软件开发-鸡啄米

VS2010_MFC编程入门之四十四(MFC常用类:定时器Timer)-软件开发-鸡啄米

5. UINT nMsg, // WM_TIMER 6. 7. UINT nIDEvent // timer identification 8. 9. DWORD dwTime // system time 10. 11. );
参数hWnd为调用SetTimer成员函数的CWnd对象的句柄,即拥有此定时器的窗口的句柄;参数n Msg为WM_TIMER,而且总是为WM_TIMER;参数nIDEvent为定时器ID;参数dwTime为系统启动以 来的毫秒数,即GetTickCount函数的返回值。
C++代 码
1. void CExample44Dlg::OnTimer(UINT_PTR nIDEvent)
2. {
3.
// TODO: Add your message handler code here and/or call default
4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. }
分类标签: 编程入门
VS2010
VC++
MFC
前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器。定时 器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSp an之后讲解。
站内搜索 请输入搜索内容..
定时器简介
定时器,可以帮助开发者或者用户定时完成某项任务。在使用定时器时,我们可以给系统传入一 个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期性的自动操作。例 如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为1个小时,那么每隔1个小时系统 就会采集一次数据,这样就可以在无人操作的情况下准确的进行操作。

MFC定时器使用

MFC定时器使用

返回
步骤3 添加WM_TIMER的消息响应函数(略)
步骤4 添加定时器消息响应代码。 void CTimerSampleDlg::OnTimer(UINT nIDEvent) {
m_Edit1=m_Edit1+1;
UpdateData(FALSE);//将变量的值送给控件显示。 CDialog::OnTimer(nIDEvent);
且仅供Windows 95及其后续版本使用,其精度与CPU的时钟频率有关,
它们要求计算机从硬件上支持精确定时器。 QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数
的原型如下:
BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency); BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
}
返回

4)编写回调函数代码 void CALLBACK CTimerSampleDlg::TimeProc(UINT uID,UINT uMsg,
DWORD dwUser,DWORD dw1,DWORD dw2)
{ m_Cal=m_Cal+1;
}
回调函数参数说明: uID——定时器标识,其值和TimerID一致。 uMsg,dw1,dw2保留参数,目前不起作用 dWUser——存放用户的回调数据。
返回
返回
4.1
3、使用QueryPerformanceFrequency()和QueryPerformanceCounter
()函数
对于更精确的定时操作,使用QueryPerformanceFrequency()和 QueryPerformanceCounter()函数。这两个函数是Visual C++提供并

VS2010和MFC编程入门之44(MFC常用类:定时器Timer)

VS2010和MFC编程入门之44(MFC常用类:定时器Timer)

VS2010MFC编程入门之四十四(MFC常用类:定时器Timer)理解了CTime类和CTimeSpan类的使用,这里继续讲与时间有关的定时器。

定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后讲解。

定时器简介定时器,可以帮助开发者或者用户定时完成某项任务。

在使用定时器时,我们可以给系统传入一个时间间隔数据,然后系统就会在每个此时间间隔后触发定时处理程序,实现周期性的自动操作。

例如,我们可以在数据采集系统中,为定时器设置定时采集时间间隔为1个小时,那么每隔1个小时系统就会采集一次数据,这样就可以在无人操作的情况下准确的进行操作。

MFC定时器VS2010编程中,我们可以使用MFC的CWnd类提供的成员函数SetTimer实现定时器功能,也可以使用Windows API函数SetTimer来实现。

两者使用方法实际上很类似,但也有不同。

CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数SetTimer则没有这个限制,这是一个很重要的区别。

因为本教程主要是讲解MFC编程,所以这里就先重点讲解MFC定时器的用法,关于API函数SetTimer的用法鸡啄米会在MFC定时器讲解的基础上进行延伸。

下面分步骤给出使用MFC定时器的方法。

1、启动定时器。

启动定时器就需要使用CWnd类的成员函数SetTimer。

CWnd::SetTimer的原型如下:UINT_PTR SetTimer(UINT_PTR nIDEvent,UINT nElapse,void (CALLBACK* lpfnTimer)(HWND,UINT,UINT_PTR,DWORD));参数nIDEvent指定一个非零的定时器ID;参数nElapse指定间隔时间,单位为毫秒;参数lpfnTimer指定一个回调函数的地址,如果该参数为NULL,则WM_TIMER消息被发送到应用程序的消息队列,并被CWnd对象处理。

c 定时器的实现原理

c 定时器的实现原理

c 定时器的实现原理定时器是计算机系统中常用的一种功能模块,它可以按照设定的时间间隔来触发一些特定的操作。

在C语言中,可以利用操作系统提供的相关函数来实现定时器的功能。

定时器的实现原理可以分为两个方面:计时器的生成和定时器的触发。

一、计时器的生成:在C语言中,可以使用clock函数来获取程序开始运行后的时钟周期数,再通过计算时钟周期数的差值来得到程序的运行时间。

具体步骤如下:1. 调用clock函数,获取程序开始运行后的时钟周期数,保存在一个变量中。

2. 执行需要计时的操作。

3. 再次调用clock函数,获取程序运行结束时的时钟周期数,保存在另一个变量中。

4. 将结束时的时钟周期数减去开始时的时钟周期数,得到两者之间的差值。

5. 将差值除以每秒钟的时钟周期数,得到程序的运行时间。

定时器的触发:通过上述计时器的生成,我们可以得到程序的运行时间。

利用这个运行时间,我们可以判断是否到达预定的时间间隔,并触发相应的操作。

具体步骤如下:1. 在程序开始时,记录当前时间为"起始时间"。

2. 执行需要计时的操作。

3. 在每次循环或特定位置,获取当前时间为"当前时间"。

4. 计算"当前时间"与"起始时间"的差值,判断是否达到设定的时间间隔。

5. 如果达到时间间隔,执行相应的操作,并将"当前时间"更新为"起始时间"。

6. 如果未达到时间间隔,继续执行循环或其他操作。

具体的C语言代码实现如下:```c#include <stdio.h>#include <time.h>int main() {time_t startTime, currentTime;double timeElapsed = 0.0;double timeInterval = 1.0; // 设定的时间间隔为1秒startTime = clock();while (1) {currentTime = clock();timeElapsed = (double)(currentTime - startTime) / CLOCKS_PER_SEC;if (timeElapsed >= timeInterval) {printf("Time interval reached!\n");// 执行需要定时触发的操作startTime = currentTime;}// 执行其他操作// 终止循环条件if (timeElapsed >= 10.0) { // 假设运行时间超过10秒后终止break;}}return 0;}```上述代码中,首先使用clock函数获取起始时间,并设置时间间隔为1秒。

MFC中和定时器使用

MFC中和定时器使用

MFC中和定时器使⽤
在MFC中和定时器相关的有三个函数:
1.设置定时器(定义⼀个定时器的属性):
SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD));
2.定时器响应(响应系统定义WM_TIMER消息):
OnTimer( UINT nIDEvent );
3.释放定时器:
KillTimer( int nIDEvent );
其中:
UINT nIDEvent:定时器的ID,在⼀个程序中⽤这个ID来确定是那个定时器发送的消息。

UINT nElapse:定义刷新时间,即间隔多长时间刷新⼀次,单位是毫秒。

void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):回调函数的参数,实现刷新时所做的操作,⼀般情况下都设为0。

在这⾥就⽤⼀个简单的例⼦来说明定时器在MFC中是如何使⽤的。

定义⾃⼰的宏变量:
#define TIMER2 1
基本的原则,在构造函数或者OnCreate()函数中定义定时,在析构函数中释放定时,在定时响应函数中修改变量。

c 定时器原理

c 定时器原理

c 定时器原理
C语言中没有内置的定时器,因此需要使用操作系统提供的定时器API来实现定时器功能。

定时器的原理是利用定时器中断来控制程序的执行。

当定时器达到设定的时间时,定时器中断会被触发,程序会执行相应的中断处理函数。

在中断处理函数中,我们可以执行一些需要定时执行的任务,如更新时间显示、控制电机转速等。

定时器的精度和延迟时间由定时器中断的时间间隔决定,时间间隔越短,定时器的精度越高,但同时也会占用更多的CPU资源。

因此,在选择定时器时间间隔时需要权衡精度和资源占用情况。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()
相关文档
最新文档