VC++ 定时器使用总结
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
void CTimerTestDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 24: ///处理ID为24的定时器
Draw1();
break;
case 25: ///处理ID为25的定时器
Draw2();
break;
}
CDialog::OnTimer(nIDEvent);
}
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
switch(nTimerid)
{
case 1: ///处理ID为1的定时器
Do1();
break;
case 2: ///处理ID为2的定时器
Do2();
break;
}
}
如:KillTimer(1);
——————————————————————————————————————————————————
MFC中定时器的使用
巧妙地使用定时器能达到意想不到的效果,写界面的时候能实现渐变,也能帮助多线程控制等
我们知道,在VC的MFC中,已经为我们封装好了很多全面和强大的函数集,所以在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。
demo1
在这里就用一个简单的例子来说明定时器在MFC中是如何使用的。
1.建立单文档程序Timer。
2.在resource.h中定义两个定时器的ID
#define TIMER1 1
#define TIMER2 2
3.在CMainFrame的OnCreate函数中定义两个定时器的属性。
SetTimer(TIMER1,3000,0);
SetTimer(TIMER2,5000,0);
4.在类视图中右击CMainFrame属性,在消息响应函数中找到WM_TIMER,然后添加响应函数OnTimer()。
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case TIMER1:
{
AfxMessageBox("定时器1!");
break;
}
case TIMER2:
{
AfxMessageBox("定时器2!");
break;
}
default:
break;
}
CFrameWnd::OnTimer(nIDEvent);
}
5.在CMainFrame的析构函数中添加释放定时器函数。
KillTimer(TIMER1);
KillTimer(TIMER2);
这样,一个简单的定时器程序就生成了,运行后可以看到,每隔3秒就会弹出一个消息对话框“定时器1”,每隔5秒就会弹出一个消息对话框“定时器2”。
这种情况是在程序运行后定时器就直接启动了,很多时候我们需要的是在响应一次事件或者说点击一个按钮后再去执行定时器,那么这时应该怎么修改呢?也用一个实例来说明吧,因为我觉得可能说一大堆废话也抵不上一个简单而正确的实例更具说服力。
demo2
现在,我生成了一个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”。
其实在不同的类,定时器的用法都是基本一致的,只要找到类的初始函数和释放函数,就能轻松实现定时功能了,就这么简单。
demo3
基于对话框的定时器程序
1.打开VC,新建一基于对话框的工程,工程名为Test在对话框上添加一按钮,将其ID改为IDC_BUTTON_START,Caption改为Start. 映像该按钮的BN_CLICKED消息,void CTestDlg::OnButtonStart();
2.再在对话框上添加一按钮,ID为ID_BUTTON_STOP,Caption改为Stop,映像消息为void CTestDlg::OnButtonStop();
3.添加一个Lable,ID改为IDC_STATIC_TIME,用于记数,表明定时器函数的执行。
4.映像对话框的WM_TIMER消息,void CTestDlg::OnTimer(UINT nIDEvent);
以上的实现函数如下所示:
void CTestDlg::OnButtonStart()
{
SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒
}
void CTestDlg::OnButtonStop()
{
KillTimer(1);//关闭定时器1。
}
void CTestDlg::OnTimer(UINT nIDEvent)
{
static int nTimer=0;
CString strTmp="";
strTmp.Format("Timer:%d",nTimer++);
CWnd *pWnd=GetDlgItem(IDC_STATIC_TIME);
pWnd->SetWindowText(strTmp); //在Lable中设置新值,表明定时器已经工作。
CDialog::OnTimer(nIDEvent);
}
回调函数的使用。
如果不想使用窗体的WM_TIMER消息函数处理,可以使用回调函数来取代,读者可以在上面例子的基础上,增加一个回调函数,以证实前面的讨论。
首先,定义一个回调函数,回调函数的定义必须按照如下格式。必须值静态的
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );
我的实现函数如下:
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);//用回调函数处理,此时对话框的消息处理函数不再处理。
}
转载自:http://my.oschina.net/ypimgt/blog/61061
程序员的基础教程:菜鸟程序员
VC++ 定时器使用总结的更多相关文章
- Win10系列:VC++ 定时器
计时器机制俗称"心跳",表示以特定的频率持续触发特定事件和执行特定程序的机制.在开发Windows应用商店应用的过程中,可以使用定义在Windows::UI::Xaml命名空间中的 ...
- VC++ 6.0使用定时器SetTimer;
背景: windows中使用VC++6.0制作了个交互界面向下位机定时发送数据及显示下位机上传的数据.定时发送则需要使用定时器. 本文只做记录如何调用,原理以后再深究. 正文: 首先,我生成的窗体类名 ...
- VC++或QT下 高精度 多媒体定时器
在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码 ...
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- VC中基于 Windows 的精确定时[转]
在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...
- Qt与VC编程合作起龌龊
由于历史原因,某软件项目的界面采用QT,而后台用了VC,界面静态调用了VC生成的dll,一直以来都能够快乐的合作,然而最近出现两个小问题,觉得两者之间的合作并没有想象的那么美好. 在VC下用多媒体定时 ...
- 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记
VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...
- VC杂记
获得Combobox的状态:向ComboBox发送CB_GETDROPPEDSTATE消息. 格式化字串:char buff[10] ; sprintf(buff,"1+1=%d" ...
- VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...
随机推荐
- 关于javascript的cookie的封装
/******************cookie*********************/ /* cookie的组成部分: 名称:唯一值,不区分大小写,必须经过URL编码 值:必须经过URL编码 ...
- java自定义事件机制分析
import java.util.ArrayList; import java.util.EventListener; import java.util.EventObject; import jav ...
- HTML5须知的特征和技术
1.新的Doctype XHTML文档类型 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- tomcat原理解析(一):一个简单的实现
tomcat原理解析(一):一个简单的实现 https://blog.csdn.net/qiangcai/article/details/60583330 2017年03月07日 09:54:27 逆 ...
- uva-10562-二叉树
题意: Homer教授被报道失踪了,我们怀疑这和他最近的研究有关,但是我们确实不知道他最近在研究什么. 侦探们试图侵入他的电脑,再几次失败后才意思到教授的智力超出他们很多............... ...
- zabbix监控windows磁盘空间
监控windows磁盘空间,不是百分比. 当windows系统添加相应的windows模板后,会自动生成检测系统空间的监控项,在应用集(Filessystem)里面,Free disk space o ...
- 4.Spring中使用Log4j
转自:https://blog.csdn.net/luohai859/article/details/52250807 这里要实现web项目中利用Spring来使用Log4j (1)接上面的工程,然后 ...
- Mysql 游标使用
BEGIN #shopsId 商家ID #accountDay 10位日期 -- 定义一个或者多个 变量来接收 游标查询的列值 DECLARE receiptContentId INT; -- 遍历数 ...
- LInux下LD_LIBRARY_PATH的作用与设置
LD_LIBRARY_PATH环境变量主要是用于指定动态链接器(Id)超早elf可执行文件运行时所依赖的动态库(so)的路径,其内容是以冒号分隔的路径列表. Id链接器优先在该变量设置的路径中查找,若 ...
- JAVA学习(七)__Spring的@Autowired注入规则
@Autowired 默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,又是怎么处理的? 经过一些代码的测试,我发现,Autowired默认先按byType,如果发现找 ...