MFC中定时器的使用

合集下载

mfc 定时器用法

mfc 定时器用法

mfc 定时器用法

MFC定时器可以让程序在固定的时间间隔内执行某个任务或事件,使用起来非常方便。下面是如何使用 MFC 定时器的步骤:

1. 在 MFC 应用程序的主窗口类中添加定时器成员变量:

UINT_PTR m_nTimerID;

2. 在 OnInitDialog 中初始化定时器:

m_nTimerID = SetTimer(1, 1000, NULL);

其中,1 表示定时器 ID,1000 表示定时器触发时间间隔(单位为毫秒),NULL 表示定时器消息处理函数为主窗口类的 OnTimer 函数。

3. 在主窗口类中添加 OnTimer 函数:

void CMyAppDlg::OnTimer(UINT_PTR nIDEvent)

{

if (nIDEvent == m_nTimerID)

{

// TODO: 在此处添加定时器任务代码

}

CDialog::OnTimer(nIDEvent);

}

其中,nIDEvent 表示定时器 ID,用于区分不同的定时器事件。

4. 在 OnClose 函数中销毁定时器:

KillTimer(m_nTimerID);

这样,当主窗口关闭时,定时器也会被销毁。

总之,MFC 定时器使用起来非常简单,只需要在程序中添加定时器成员变量、初始化定时器、编写定时器任务代码和销毁定时器即可。

利用定时器和双缓冲技术在MFC中绘制动画

利用定时器和双缓冲技术在MFC中绘制动画

_ 十 r 黪
f 敦字 技 术
设 计 开 发
利用定时器和双缓冲技术在 MF C中绘制动画
杜 小 甫
( 沈 阳城 市建设 学 院信 息 与控 制 工程Байду номын сангаас系 辽 宁沈 阳 1 1 0 1 6 7 )
摘 要: 对MF c中动 画绘制 涉及 到的 两个 重要技 术做 较全 面 的总结 和提 炼, 创 建 了一个通 用性 较 强的动 画绘制程 序框 架 。 首先 对MF C'  ̄定时 器 技 术和 双 缓冲技 术做 出深入 分析; 其 次创 建 一 个动 画绘制 程序 框 架; 最后 通过 几 个动 画程序验 证 该框 架 。 该程 序框 架 已经应 用在 实际工作 中, 证 明 该框 架是 精 炼有 效 的 。
关 键N : MF C 动 画 定 时器 双缓 冲 中图分 类号 : T P 3 l 1 . 1 I 文献 标识 码: A
文 章编 号: 1 0 0 7 - 9 4 1 6 ( 2 0 1 3 ) 0 8 — 0 1 2 9 一 O 1
个“ 动画 ” 菜单项 , 设置好对应 的I D。 第二步 , 向Chu i t u Vi e w类 中添 加一 个布 尔型 成员 变量 MFC 是微软公司推 出的软件开发架 构[ 1 l , 在MF C中绘 制动画 o n g h u a l f a g, 用 于表示是否显示动 画。 常见于各类软件 开发。 动 画绘制一种思路是利用循环语句加延迟函 d 第三 步 , 利用类向导创 建对 “ 动画” 菜单 项的响应 函数 。 该 函数 数 的方式[ 2 】 , 另外一种 思路就是利用定 时器口 1 定时更像 图片绘制动 的内容很 简单 , 如下所示 。 画。 后者在绘 制过程 中可 以响应其他事件 , 因此 应用十分广泛 。 i f ( d o n g h u a l f a g = = t r u e ) { 1 . 1定 时器技 术

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

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

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

实验七MFC 定时器编程实验

一、预备知识

1、定时器消息

定时器时间到时,向窗口发送WM_TIMER 消息,应用程序窗口通过处理该消息来对定时器事件进行处理,该消息的参数说明如下:WM_TIMER

wTimerID = 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 编程模式中定时器的使用方法。

三、实验内容

MFC 定时器用法

MFC 定时器用法

MFC中定时器的使用 在/doc/">程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动。MFC提供了定时器来完成这个功能。在MFC中和定时器相关的有三个函数:UINT SetTimer( UINT nIDEvent, UINT nElapse,void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) );afx_msg void OnTimer( UINT nIDEvent );BOOL KillTimer( int nIDEvent );参数说明:UINT nIDEvent:定时器的ID,给定时器唯一的身份验证,如果在一个/doc/">程序中有多个定时器可以用这个ID来确定是那个定时器发送的消息。UINT nElapse: 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):这个回调函数中实现刷新时所做的操作,如在数据库中读取数据。但是我们大多数时候不在这里实现,而是在OnTimer中。函数功能:SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。OnTimer实际时系统定义消息用来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别响应,这里才时定时/doc/">程序大展宏图的地方。 字串2KillTimer用来结束一个定时器。 字串1下面我们用一个例子来说明定时器的使用:这个例子用来实现一个简单的功能,就是在一个单/doc/">文档/doc/">程序中,每间隔5秒弹出一个消息框提示“定时器1”,每隔7秒弹出一个消息框提示“定时器2”。建立单/doc/">文档/doc/">程序略,一路Next。(1)在resource.h中定义两个定时器的ID#define IDTIMER1 1#define IDTIMER2 2(2)在CMainFrame的OnCreate函数中定义两个定时器的属性。SetTimer(TIMEID1,5000,0);SetTimer(TIMEID2,7000,0);(3) CMainFrame中对WM_TIMER进行响应。void CMainFrame::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultswitch(nIDEvent) {case TIMEID1:{ AfxMessageBox("定时器1!");break;} 字串1case TIMEID2:{ AfxMessageBox("定时器2!");break;}default:;}CFrameWnd::OnTimer(nIDEvent);}(4)在CMainFrame的析构函数中添加KillTimer(IDTIMER1);KillTimer(IDTIMER2);本篇文章来源于 忒好程序员| 原文链接:/html/doc/kfyy/20071226/1105.htmlTimer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。1、SetTimer定义在那里?SetTimer表示的是

MFC实现简单的小闹钟

MFC实现简单的小闹钟
6
CTabCtrl的使用
❖ 1)在资源管理器中创建几个Dialog, 分别生成相应的类 (基于CDialog),注意,要设置Dialog的Style为 “Child”, Border为“None”。
❖ 2)在CDialog::OnInitDialog中,调用 CTabCtrl::InsertItem(...)方法添加几个页面 。
定义一个CUserData类, 用来保存设定时间和 wav路径等信息
9
❖ 如何将这个类写入文件保存呢?通过查询msdn得知,将一 个类永久保存,也就是实现类的串行化(sariallization), 有以下五个步骤:
一.将你的类从CObject继承。 二.重载serialize这个成员函数。 三.在类的声明里面加上DECLARE_SERIAL这个宏 四.定义一个没有争议的默认构造函数。 五.在类的实现文件里加入IMPLEMENT_SERIAL这个宏。
❖ 程序已经最小化到托盘区了,但是呢,对托盘图标的操作如何进行呢? 这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用 了。它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无 论是左键还是右键),会向hWnd所代表的窗口传送消息,如果是上例, 消息的名称就是WM_SHOWTASK。根据VC的消息机制,对自定义消 息增加消息响应函数。
10

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 efault

CDialog::OnTimer(nIDEvent);//这句话编译器自动添加,看样子是判断第几个定时器触发的响应。貌似可以删掉。

}

二.到此就可以使用定时器了。

使用方法:首先执行SetTimer(UINT nIDEvent,timer,NULL);其中UINT nIDEvent是定时器编号,

需自己设定想用定时器1就设为1。雷同于单片机的定时器1和2。timer是uint型,表示定时时间,单位为ms.NULL保留。

然后添加中断函数如下:

void CMy56Dlg::OnTimer(UINT nIDEvent)

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)

CMFC中定时器的使用

CMFC中定时器的使用

CMFC中定时器的使用

MFC(Microsoft Foundation Class)是一套面向Windows平台的

C++类库,它简化了Windows API的使用,并提供了一些常用的界面和功

能组件。MFC中的定时器允许开发人员在应用程序中设置一定的时间间隔,以执行特定的任务或更新界面。本文将详细介绍MFC中定时器的使用方法。

在MFC中,定时器的创建和管理是通过CWnd类来实现的。CWnd类是MFC中所有窗口类的基类,它封装了一些与窗口有关的函数和属性。

首先,需要在窗口类的头文件中添加响应的定时器消息映射:

```cpp

class CMyWnd : public CWnd

DECLARE_MESSAGE_MAP

afx_msg void OnTimer(UINT_PTR nIDEvent);

};

```

然后,在窗口类的源文件中添加消息映射的处理函数:

```cpp

BEGIN_MESSAGE_MAP(CMyWnd, CWnd)

ON_WM_TIMER

END_MESSAGE_MAP

void CMyWnd::OnTimer(UINT_PTR nIDEvent)

switch (nIDEvent)

case 1:

//处理定时器1的逻辑

break;

case 2:

//处理定时器2的逻辑

break;

default:

break;

}

CWnd::OnTimer(nIDEvent);

```

在窗口类的构造函数中,可以通过调用CWnd类的SetTimer函数来创建定时器:

```cpp

CMyWnd::CMyWnd

SetTimer(1, 1000, NULL); // 创建ID为1的定时器,时间间隔为1000ms

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)

定时器使用的流程 (2)

定时器使用的流程 (2)

定时器使用的流程

概述

定时器是一种用于计划、管理和控制时间的工具。在软件开发中,定时器常用

于处理需要在一定时间间隔内重复执行的任务,或者需要在特定时间点触发的事件。本文将介绍定时器的使用流程,包括创建定时器、设置定时器参数、启动定时器以及处理定时器的回调函数等。

步骤

1.创建定时器对象

定时器对象是使用定时器的第一步。首先,需要通过调用相关的API函数创建

一个定时器对象。例如,在C++中可以使用std::timer类,而在JavaScript中可

以使用setInterval函数。具体的创建方式会根据编程语言的不同而有所差异。

2.设置定时器参数

在创建定时器对象之后,需要设置定时器的参数。参数包括定时器的时间间隔、重复执行次数等。可以根据实际需求设置不同的参数。例如,如果需要每隔一秒执行一次任务,可以将时间间隔设置为1000毫秒。

3.编写定时器回调函数

定时器回调函数是定时器执行任务时所调用的函数。在创建定时器对象之后,

需要编写这个回调函数。回调函数需要完成需要定时执行的任务。例如,在一个定时器回调函数中可以输出一行文本,或者调用其他函数来完成复杂的操作。

4.启动定时器

设置好定时器参数并编写好定时器回调函数之后,可以通过调用相关的API函

数启动定时器。启动定时器后,定时器将根据设定的时间间隔开始执行任务。定时器会按照设定的时间间隔重复执行,直到达到设定的重复执行次数或者手动停止定时器。

5.处理定时器回调

在定时器启动之后,定时器会按照设定的时间间隔自动调用定时器回调函数。

回调函数可以在每次定时器被触发时执行特定的操作。例如,可以在每次定时器被触发时更新界面、发送网络请求、执行数据处理等操作。

利用定时器和双缓冲技术在MFC中绘制动画

利用定时器和双缓冲技术在MFC中绘制动画

利用定时器和双缓冲技术在MFC中绘制动画

作者:杜小甫

来源:《数字技术与应用》2013年第08期

摘要:对MFC中动画绘制涉及到的两个重要技术做较全面的总结和提炼,创建了一个通用性较强的动画绘制程序框架。首先对MFC中定时器技术和双缓冲技术做出深入分析;其次创建一个动画绘制程序框架;最后通过几个动画程序验证该框架。该程序框架已经应用在实际工作中,证明该框架是精炼有效的。

关键词:MFC 动画定时器双缓冲

中图分类号:TP311.11 文献标识码:A 文章编号:1007-9416(2013)08-0129-01

1 定时器和双缓冲技术

MFC是微软公司推出的软件开发架构[1],在MFC中绘制动画常见于各类软件开发。动画绘制一种思路是利用循环语句加延迟函数的方式[2],另外一种思路就是利用定时器[3]定时更像图片绘制动画。后者在绘制过程中可以响应其他事件,因此应用十分广泛。

1.1 定时器技术

定时器可以向系统定时发送信号,触发OnTimer函数。在定时器使用过程中涉及到三个常用函数,分别对应着使用定时器的三个步骤。

(1)创建定时器。创建定时器使用SetTimer函数。MFC中提供两个SetTimer函数,一个是全局函数,可以在程序的任意位置调用。我们更常使用的是第二种SetTimer函数,由CWnd类重载。函数有三个参数,分别是定时器编号、时间间隔和回调函数[4]地址。

(2)处理定时器信号。MFC在OnTimer函数中处理定时器信号。OnTimer函数具有一个参数,是捕捉到的定时器编号。我们可以利用其区分不同的定时器信号,执行不同代码。

MFC中定时器的使用

MFC中定时器的使用

我的实现函数如下: void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime ) { AfxMessageBox("Timer is running!");//定时器时间到,强出一对话框,表明定时器已经运行。 }
将上面的启动函数稍做修改 void CTestDlg::OnButtonStart() { // SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒 SetTimer(1,1000,(TIMERPROC)TimerProc);//用回调函数处理,此时对话框的消息处理函数不再处理。
2.再在对话框上添加一按钮,ID 为ID_BUTTON_STOP,Caption 改为Stop,映像消息为void CTestDlg::OnButtonStop(); 3.添加一个Lable,ID改为IDC_STATIC_TIME,用于记数,表明定时器函数的执行。 4.映像对话框的WM_TIMER消息,void CTestDlg::OnTimer(UINT nIDEvent);
5.在CMainFrame的析构函数中添加释放定时器函数。 KillTimer(TIMER1); KillTimer(TIMER2); 这样,一个简单的定时器程序就生成了,运行后可以看到,每隔3秒就会弹出一个消息对话框“定时器 1”,每隔5秒就会弹出一个消息对话框“定时器2”。 这种情况是在程序运行后定时器就直接启动了,很多时候我们需要的是在响应一次事件或者说点击一个按 钮后再去执行定时器,那么这时应该怎么修改呢?也用一个实例来说明吧,因为我觉得可能说一大堆废话 也抵不上一个简单而正确的实例更具说服力。 另一个人做的 现在,我生成了一个MFC多文档应用程序,我希望在点击菜单条上的某个按钮后再去执行定时器。这时就 不是在CMainFrame里面操作了,因为我们是要在对话框上进行定时器的操作,而CView这个类是负责对话框 的对应操作,所以要把定时器定义在CView里面。 1.建立多文档程序Timer。 2.在resource.h中定义两个定时器的ID #define TIMER1 1 #define TIMER2 2 3.在CTimerView的OnInitialUpdate函数中定义两个定时器的属性。 SetTimer(TIMER1,3000,0); SetTimer(TIMER2,5000,0); 4.在类视图中右击CTimerView属性,在消息响应函数中找到WM_TIMER,然后添加响应函数OnTimer()。 void CTimerView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default //Hwnd为一个变量,初始值为false,点击某个按钮后在其响应函数中将其置为true switch(nIDEvent && Hwnd){ case TIMER1: { AfxMessageBox("定时器1!"); break; } case TIMER2: { AfxMessageBox("定时器2!"); break; } default: break; } CFrameWnd::OnTimer(nIDEvent); } 5.在CTimerView中添加OnDestroy()函数,在函数中释放定时器。 KillTimer(TIMER1); KillTimer(TIMER2); 现在,运行程序后,没有马上弹出预定的对话框,而是在我们点击某个按钮或者响应某个事件后对话框才 弹出,同样是点击按钮后,每隔3秒弹出对话框“定时器1”,每隔5秒弹出“定时器2”。

定时器的使用方法

定时器的使用方法

定时器的使用方法

定时器是一种常用的工具,它可以在特定的时间间隔内执行某

个任务或者动作,比如定时关闭电脑、定时播放音乐等。在日常生

活和工作中,我们经常会用到定时器,因此掌握定时器的使用方法

是非常重要的。下面,我将为大家介绍定时器的使用方法,希望能

够帮助大家更好地利用定时器。

首先,我们需要了解定时器的基本原理。定时器是通过设定一

个时间间隔,当时间到达设定的间隔时,就会触发相应的操作。在

计算机领域,定时器通常是通过编程语言或者操作系统提供的接口

来实现的。在其他领域,比如家用电器、手机应用等,定时器也是

通过相应的设备或者软件来实现的。

在计算机编程中,定时器的使用方法通常包括以下几个步骤:

1. 初始化定时器,首先,我们需要初始化定时器,设置时间间

隔和触发的操作。这通常包括设置定时器的周期、触发条件等参数。

2. 启动定时器,一旦定时器初始化完成,我们就可以启动定时器,让它开始工作。在计算机编程中,通常是调用相应的函数或者

方法来启动定时器。

3. 处理定时器触发事件,当定时器的时间间隔到达时,就会触

发相应的事件。在编程中,我们通常会编写相应的处理函数来处理

定时器触发的事件。

4. 停止定时器,在某些情况下,我们可能需要停止定时器的工作。这通常是通过调用相应的函数或者方法来实现的。

除了计算机编程中的定时器使用方法,我们在日常生活中也经

常会用到定时器。比如,定时器可以用来设置闹钟、定时关闭电视、定时煮饭等。在手机应用中,定时器也经常被用来设置提醒、定时

播放音乐等功能。在家用电器中,定时器也被广泛应用,比如洗衣

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;

VC++中通过SetTimer函数创建并使用定时器

VC++中通过SetTimer函数创建并使用定时器

VC++中通过SetTimer函数创建并使用定时器SetTimer函数可以用来创建或设置一个定时器,该函数创建的定时器与Timer控件(定时器控件)效果相同。当你想每隔一段时光执行一件事的的时候,你可以用法它。用法定时器的办法比较容易,通常告知WINDOWS一个时光间隔,然后WINDOWS以此时光间隔周期性触发程序。

通常有两种办法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。 SetTimer函数的使用 1.1 用WM_TIMER来设置定时器先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID推断是哪个定时器 UINT uElapse, // 时光间隔,单位为毫秒 TIMERPROC lpTimerFu // 回调函数 ); 例如

SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了于是SetTimer函数的原型变为: UINT SetTimer(UINT nIDEvent,UINT nElapse,vo(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)) 当用法SetTimer函数的时候,就会生成一个计时器。函数中nIDEvent

指的是计时器的标识,也就是名字。nElapse指的是时光间隔,也就

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

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

}
17. }
回调函数为全局函数,需要写在使用它的位置的前面,或者写在后面然后在使用之前声明。
3、销毁定时器。 不再使用定时器时,可以销毁它。销毁定时器需使用CWnd类的KillTimer成员函数,CWnd::KillTi mer函数的原型如下:
C++代 码 1. BOOL KillTimer(UINT_PTR nIDEvent);
最近发表
VC++操作Word之简明入门教程 VC++文件操作之最全篇 小菜和大鸟的编程故事之十四:设计模式不能戏 说!设计模式怎就不能戏说? 小菜和大鸟的编程故事之十三:门面让程序员的 程序更加体面 小菜和大鸟的编程故事之十二:无熟人难办事?-聊设计模式之迪米特法则 小菜和大鸟的编程故事之十一:三层架构 分层开 发 小菜和大鸟的编程故事之十:会修电脑不会修收 音机?--谈设计模式原则 小菜和大鸟的编程故事之九:反射--程序员的快乐 小菜和大鸟的编程故事之八:初识'策略模式'
鸡啄米
聚焦互联网、数码、软件开发和编程入门的IT休闲吧
首页 IT互联网 数码生活 软件开发 职场人生 娱乐休闲 安卓开发 留言簿
首页 » 软件开发 » VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)
订阅鸡啄米
VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在MFC中和定时器相关的有三个函数:
UINT SetTimer( UINT nIDEvent, UINT nElapse,
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) );
afx_msg void OnTimer( UINT nIDEvent );
BOOL KillTimer( int nIDEvent );
参数说明:
UINT nIDEvent:定时器的ID,给定时器唯一的身份验证,如果在一个/doc/">程序中有多个定时器可以用这个ID来确定是那个定时器发送的消息。
UINT nElapse: 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):
这个回调函数中实现刷新时所做的操作,如在数据库中读取数据。但是我们大多数时候不在这里实现,而是在OnTimer中。
函数功能:
SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。
OnTimer实际时系统定义消息用来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别响应,这里才时定时/doc/">程序大展宏图的地方。
字串2
KillTimer用来结束一个定时器。 字串1
下面我们用一个例子来说明定时器的使用:

这个例子用来实现一个简单的功能,就是在一个单/doc/">文档/doc/">程序中,每间隔5秒弹出一个消息框提示“定时器1”,每隔7秒弹出一个消息框提示“定时器2”。
建立单/doc/">文档/doc/">程序略,一路Next。
(1)在resource.h中定义两个定时器的ID
#define IDTIMER1 1
#define IDTIMER2 2
(2)在CMainFrame的OnCreate函数中定义两个定时器的属性。
SetTimer(TIMEID1,5000,0);
SetTimer(TIMEID2,7000,0);
(3) CMainFrame中对WM_TIMER进行响应。
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent) {
case TIMEID1:
{
AfxMessageBox("定时器1!");
break;
} 字串1
case TIMEID2:
{
AfxMessageBox("定时器2!");
break;
}
default:
;
}

CFrameWnd::OnTimer(nIDEvent);
}
(4)在CMainFrame的析构函数中添加
KillTimer(IDTIMER1);
KillTimer(IDTIMER2);
本篇文章来源于 忒好程序员|
原文链接:/html/doc/kfyy/20071226/1105.html

Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。
1、SetTimer定义在那里?
SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。
SetTimer有两个函数。一个是全局的函数::SetTimer()
UINT SetTimer(
HWND hWnd, // handle of window for timer messages
UINT nIDEvent,

// timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // address of timer procedure
);
其中hWnd 是指向CWnd的指针,即处理Timer事件的窗口类。说道窗口类(CWnd),我们有必要来看一下CWnd的继承情况:CWnd有以下子
类:CFrameWnd,CDialog,CView,CControlBar等类。这也意味这些类中都可以定义SetTimer事件。
同时,SetTimer()在CWnd中也有定义,即SetTimer()是CWnd的一个成员函数。CWnd的子类可以调用该函数,来设置触发器。
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*
lpfnTimer)(HWND, UINT, UINT, DWORD) );
参数含义:
nIDEvent:是指设置这个定时器的iD,即身份标志,这样在OnTimer()事件中,才能根据不同的定时器,来做不同的事件响应。这个ID是一个无符号的整型。
nElapse
是指时间延迟。单位是毫秒。这意味着,每隔nElapse毫秒系统调用一次Ontimer()。
void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)
Specifies the address of the application-supplied
TimerProc
callback function that processes the WM_TIMER messages. If this parameter is
NULL, the WM_TIMER messages are placed in the application’s message queue and
handled by the CWnd object。
意思是,指定应用程序提供的TimerProc回调函数的地址,来处里这个Timer事件。如果是NULL,处理这个Timer事件的定义这个Timer的CWnd对象。他将WM_TIMER消息传递给这个对象,通过实现这个对象的OnTimer()事件来处理这个Timer事件。
所以,一般情况下,我们将这个值设为NULL,有设置该定时器的对象中的OnTimer()函数来处理这个事件。
同样的,我们再看看KillTimer()和OnTimer()的定义:
KillTimer同SetTimer()一样,他也有两个,一个是全局的::KillTimer(),另一个是CWnd的一个函数。他的声明如下:
//全局函数
BOOL KillTimer(
HWND hWnd, // handle of window that installed timer
UINT uIDEvent // timer identifier
);
//CWnd函数
BOOL KillTimer( int nIDEvent );
这两个函数表示的意思是将iD为nIDEVENT的定时器移走。使其不再作用。其用法如同SetTimer()一样。
再看看OnTimer()
afx_msg void OnTimer( UINT nIDEvent );
ontimer()是响应CWnd对象产生的WM_Timer消息。nIDEvent表示要响应TIMER事件的ID。
二、Timer事件的使用:
由以上的分析,我们应该很清楚,如何来使用Timer事件。假定我们在视图上画一个渐变的动画。我们首先在菜单栏上添加一个菜单项,给这个菜单添加命令响应:
pView->SetTimer(1,1000,NULL);//pView是视图类的指针,这里是在视图类当中设置一个定时器。
添加完毕,再给视图类添加一个WM_Timer事件的相应。在OnTimer()函数中编写汉书,进行相应。
如此,就能做出动画。




多媒体定时器

微软公司在其多媒体Windows中提供了精确定时器的底层API支持。利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用。利用多媒体定时器的基本功能,可以通过两种方法实现精确定时。


1.使用timeGetTime()函数

该函数定时精度为ms级,返回从Windows启动开始所经过的时间。由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。


2. 使用timeSetEvent()函数

利用该函数可以实现周期性的函数调用。函数的参数说明如下:

uDelay:延迟时间;

uResolution:时间精度,在Windows中缺省值为1ms;

lpFunction:回调函数,为用户自定义函数,定时调用;

dwUser:用户参数;

uFlags:标志参数;

TIME_ONESHOT:执行一次;

TIME_PERIODIC:周期性执行。

具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在lpFunction回调函数中(如:定时采样、控制
等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用 timeKillEvent()将之释放。


下面这段代码的主要功能是设置两个时钟定时器,一个间隔是1ms,一个间隔是2s。每执行一次,把当前系统时钟值输入文件“cure.out”中,以比较该定时器的精确度。


//定义1ms和2s时钟间隔,以ms为单位

# define ONE_MILLI_SECOND 1

# define TWO_SECOND 2000

//定义时钟分辨率,以ms为单位

# define TIMER_ACCURACY 1

//定义时间间隔

UINT wTimerRes_1ms,wTimerRes_2s;

//定义分辨率

UINT wAccuracy;

//定义定时器句柄

UINT TimerID_1ms,TimerID_2s;

//打开输出文件“cure.out”

CCureApp::CCureApp():fout(“cure.out”, ios::out)

{

// 给时间间隔变量赋值

wTimerRes_1ms = ONE_MILLI_SECOND;

wTimerRes_2s = TWO_SECOND;

TIMECAPS tc;

//利用函数timeGetDevCaps取出系统分辨率的取值范围,如果无错则继续

if(timeGetDevCaps(&tc,sizeof(TIMECAPS))==TIMERR_NOERROR)

{

//分辨率的值不能超出系统的取值范围

wAccuracy=min(max(tc.wPeriodMin,

TIMER_ACCURACY),tc.wPeriodMax);

//调用timeBeginPeriod函数设置定时器的分辨率

timeBeginPeriod(wAccuracy);

//设置定时器

InitializeTimer();

}

}

CCureApp:: ~CCureApp()

{

//结束时钟

fout <<“结束时钟”<< endl;

// 删除两

个定时器

timeKillEvent(TimerID_1ms);
timeKillEvent(TimerID_2s);

// 删除设置的分辨率

timeEndPeriod(wAccuracy);

}

void CCureApp::InitializeTimer()

{

StartOneMilliSecondTimer();

StartTwoSecondTimer();

}

// 1ms定时器的回调函数,类似于中断处理程序,一定要声明为全局PASCAL函数,否则编译会有问题

void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD
dwUser,DWORD dwl,DWORD dw2)

{

// 定义计数器

static int ms = 0;

CCureApp *app = (CCureApp *)dwUser;

// 取得系统时间,以ms为单位

DWORD osBinaryTime = GetTickCount();

//输出计数器值和当前系统时间

app->fout<<++ms<<“:1ms:”

<
}

// 加装1ms定时器

void CCureApp::StartOneMilliSecondTimer()

{

if((TimerID_1ms = timeSetEvent(wTimerRes_1ms,

wAccuracy,

// 回调函数

(LPTIMECALBACK) OneMil liSecondProc,

// 用户传送到回调函数的数据

(DWORD)this,

/ *周期调用,只使用一次,用TIME_ONESHOT*/

TIME_PERIODIC)) == 0)

{

AfxMessageBox(“不能进行定时!”, MB_OK | MB_ICONASTERISK);

}

else //不等于0表明加装成功,返回此定时器的句柄

fout << “16ms 计 时:” << endl;

}

相关文档
最新文档