MFC 定时器用法
MFC onTime函数使用
MFC onTime函数使用你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIMER消息映射,就自动生成OnTime函数了。
介绍如下:总的来说, 这里面一共需要三个函数:SetTimer, KillTimer()和OnTimer().先请看SetTimer这个API函数的原型UINT_PTR SetTimer(HWND hWnd,// 窗口句柄UINT_PTR nIDEvent,// 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT uElapse,// 时间间隔,单位为毫秒TIMERPROC lpTimerFunc// 回调函数);例如SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了于是SetTimer函数的原型变为:UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT*lpfnTimer)(HWND,UINT ,YINT ,DWORD))当使用SetTimer函数的时候,就会生成一个计时器。
函数中nIDEvent指的是计时器的标识,也就是名字。
nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。
第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是onTime函数。
这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。
然后在函数里添加代码,让代码实现功能。
每隔一段时间就会自动执行一次。
例:SetTimer(1,1000,NULL);1:计时器的名称;1000:时间间隔,单位是毫秒;NULL:使用onTime函数。
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 定时器使用起来非常简单,只需要在程序中添加定时器成员变量、初始化定时器、编写定时器任务代码和销毁定时器即可。
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) 总结实验的心得体会,实验中遇到的困难以及解决的方法等通过本次实验编程,我学习掌握了从类向导中直接添加消息映射的步骤和方法,了解到通过类向导可以直接在项目中直接添加消息映射,添加处理函数,添加命令,添加成员变量等,使用类向导为我们的编程带来了许许多多的方便,省去了手动添加消息映射,添加成员函数的麻烦。
利用定时器和双缓冲技术在MFC中绘制动画
文 章编 号: 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定 时器技 术
渗
_ 十 r 黪
f 敦字 技 术
设 计 开 发
利用定时器和双缓冲技术在 MF C中绘制动画
杜 小 甫
( 沈 阳城 市建设 学 院信 息 与控 制 工程 系 辽 宁沈 阳 1 1 0 1 6 7 )
摘 要: 对MF c中动 画绘制 涉及 到的 两个 重要技 术做 较全 面 的总结 和提 炼, 创 建 了一个通 用性 较 强的动 画绘制程 序框 架 。 首先 对MF C'  ̄定时 器 技 术和 双 缓冲技 术做 出深入 分析; 其 次创 建 一 个动 画绘制 程序 框 架; 最后 通过 几 个动 画程序验 证 该框 架 。 该程 序框 架 已经应 用在 实际工作 中, 证 明 该框 架是 精 炼有 效 g =f a l s e I
MFC实现简单的小闹钟
播放声音
❖ 加入Mmsystem.h头文件。 ❖ 加入winmm.lib文件。可以在工程中设置,也可以在文件中
加入以下语句: #pragma comment(lib,"winmm.lib") ❖ 用PlaySound()函数播放声音。
11
最小化到托盘
❖ 把程序放到托盘上的本质就是先在托盘区绘制一个图标,然 后把程序隐藏不见,再对托盘的图标进行消息处理,就可以 了。 绘制图标以及确定图标所传送消息的函数只有一个, 那就是——— WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid );
❖ 需求分析 ❖ 实现过程 ❖ 实现情况
内容概要
1
需求分析
❖ 程序功能: 实现一个小闹钟。 首先有两个标签页(CTabCtrl控件类),一个标签是
定时器,设定好时间和提示音乐后点击OK,当设定 的时间到达后(可以使用CTime类),提示音乐响 起;另一个标签是倒计时器,设定好倒计时的秒数, 点击OK后便开始倒计时(使用WM_TIMER消息来 实现计时),当倒计时减小到0时,提示音乐响起。
14
然后就是在CPP文件中加入函数onShowTask的实现了:
15
实现情况
❖ 基本功能实现。但是不是很实用,每次定时之后要么保持程 序一直运行,要么在设定时间到达之前手动开启才能听到闹 铃。
解决方案的设想: 1.设置开机启动,让程序自动运行。 2.设置任务计划,在特定的时间开启程序。
16
Thank You!
❖ 程序已经最小化到托盘区了,但是呢,对托盘图标的操作如何进行呢? 这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用 了。它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无 论是左键还是右键),会向hWnd所代表的窗口传送消息,如果是上例, 消息的名称就是WM_SHOWTASK。根据VC的消息机制,对自定义消 息增加消息响应函数。
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控件使用方法VC2012下MFC程序各控件的常用方法分类:vc控件2013-02-16 16:32 94人阅读评论(0) 收藏举报一下控件的用法全部在VC2012下调试通过,特发文收藏(部分内容来自或参考自网络):Static Text:将ID号改成唯一的一个,如:IDC_XX,然后进一次类向导点确定产生这个ID,之后更改Caption属性:GetDlgItem(IDC_XX)->SetWindowText(L"dsgdhfgdffd");设置字体:CFont *pFont= new CFont;pFont->CreatePointFont(120,_T("华文行楷"));GetDlgItem(IDC_XX)->SetFont(pFont);Edit Control:设置文本:SetDlgItemT ext(IDC_XX,L"iuewurebfdjf");获取所有输入:建立类向导创建一个成员变量(假设是shuru1,shuru2……)类型选value,变量类型任选。
UpdateData(true);GetDlgItem(IDC_XX)->SetWindowText(shuru1);第一句更新所有建立了变量的对话框组件,获取输入的值。
第二句将前面的IDC_XX的静态文本内容改为shuru1输入的内容。
若类型选用control:1.设置只读属性:shuru1.SetReadOnly(true);2.判断edit中光标状态并得到选中内容(richedit同样适用)int nStart,nEnd;CString strTemp;shuru1.GetSel(nStart,nEnd);if(nStart== nEnd){strTemp.Format(_T("光标在%d" ),nStart);AfxMessageBox(strTemp);}else{//得到edit选中的内容shuru1.GetWindowText(strTemp);strTemp= strTemp.Mid(nStart,nEnd-nStart);AfxMessageBox(strTemp);}其中nStart和nEnd分别表示光标的起始和终止位置,从0开始。
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中的定时器 - cxun - 博客园
--YorkCai 5. Re:Crypto++库在VS 2005中 的使用——RSA加解密 @YorkCai引用文章最后提到错误 ,我也遇到,请问如何解决?博文中 已提到:“如果上面的第(3)步没有设 置则会出现以下链接错误:”
文 章 分 类 (3)
算法(1) 游戏开发(2)
最新评论
1. Re:解决 typedef void * POI NTER_64 PVOID64; 问题 include 顺序问题 $(IncludePath );..\libs \DSho w \Include
--OnlyLiu 2. Re:VirtualBox开发环境的搭建 详解 @小小学童引用最后通过编译成功 ,运行loadall.cmd,就出现以下提 示:////////////////////////////////// /////////////'kmk_ash' 不是内部或 外部命令,也不是可运行的程序或批 处理文件。////////////////////////// ///////////////////不知道是什么原因 啊?楼主能指点一下吧,谢谢了!! 不好意思,我没遇到过...
Copyright ©2013 cxun
posted @ 2007-04-28 20:28 cxun 阅读(6362) 评论(0) 编辑 收藏
注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。
刷新评论 刷新页面 返回顶部
Байду номын сангаас
MFC编程总结各种控件使用说明
MFC各种控件的使用说明把整数显示为时间格式的方法:Int minute=5; int sec=5;CString strTime;strTime.Format("%02d:%02d",minute,sec);GetDlgItem(IDC_STAT_DIS)->SetWindowText(strTime);定时器的使用方法:在函数BOOL CDingshiqiDlg::OnInitDialog(){SetTimer(1,1000,NULL);}添加语句SetTimer(1,1000,NULL);定时器1秒钟中断一次.然后添加消息WM_TIMER对应的消息函数:void CDingshiqiDlg::OnTimer(UINT nIDEvent){}播放系统声音的方法:在头文件添加这两句#include<mmsystem.h>#pragma comment (lib,"winmm.lib")然后调用函数: PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);VC++6.0控件工具箱:2 图形控件(picture):常用于显示位图(Bitmap)和图标(Icon)3 静态文本(Static Text):MFC提供了CStatic类支持静态控件。
(1)更改该控件上字体的方法是:该控件的ID为IDC_STATIC1,IDC_STATIC2.CFont * f1;f1 = new CFont;f1 -> CreateFont( 25 , // nHeight15, // nWidth0 , // nEscapement0 , // nOrientationFW_BOLD, // nWeightFALSE , // TRUEbItalicFALSE, // bUnderline0 , // cStrikeOutDEFAULT_CHARSET, //ANSI_CHARSET nCharSetOUT_DEFAULT_PRECIS, // nOutPrecisionCLIP_DEFAULT_PRECIS, // nClipPrecisionDEFAULT_QUALITY, // nQualityDEFAULT_PITCH | FF_SWISS, // nPitchAndFamily_T( " 宋体" )); // lpszFacGetDlgItem(IDC_STATIC1)-> SetFont(f1);GetDlgItem(IDC_STATIC2)-> SetFont(f1);另一种改变字体大小的方法: 在函数外定义CStatic m_static;CFont font;m_static.SubclassDlgItem(IDC_STAT_DIS,this);LOGFONT log;GetObject(::GetStockObject(DEFAULT_GUI_FONT),sizeof(log),&log);log.lfHeight=300; //改log.lfWidth=120; //改log.lfCharSet=GB2312_CHARSET;lstrcpy(log.lfFaceName, _T("宋体"));font.CreateFontIndirect(&log);m_static.SetFont(&font);(2) 把整数显示在该控件的方法:IDC_STAT_DIS为控件IDInt minute=5,sec=5;CString strTime;strTime.Format("%02d:%02d",minute,sec);GetDlgItem(IDC_STAT_DIS)->SetWindowText(strTime);另外一种显示的方法:CStatic*pst=(CStatic *)GetDlgItem(IDC_STAT_DIS);pst->SetWindowText("00:00");4 编辑框(Edit Box):MFC提供了CEdit类支持编辑框控件。
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函数库可以为我们省去很多麻烦
巧妙地使用定时器能达到意想不到的效果,写界面的时候能实现渐变,也能帮助多线程控制等 我们知道,在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。 在这里就用一个简单的例子来说明定时器在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); }
利用定时器和双缓冲技术在MFC中绘制动画
利用定时器和双缓冲技术在MFC中绘制动画作者:杜小甫来源:《数字技术与应用》2013年第08期摘要:对MFC中动画绘制涉及到的两个重要技术做较全面的总结和提炼,创建了一个通用性较强的动画绘制程序框架。
首先对MFC中定时器技术和双缓冲技术做出深入分析;其次创建一个动画绘制程序框架;最后通过几个动画程序验证该框架。
该程序框架已经应用在实际工作中,证明该框架是精炼有效的。
关键词:MFC 动画定时器双缓冲中图分类号:TP311.11 文献标识码:A 文章编号:1007-9416(2013)08-0129-011 定时器和双缓冲技术MFC是微软公司推出的软件开发架构[1],在MFC中绘制动画常见于各类软件开发。
动画绘制一种思路是利用循环语句加延迟函数的方式[2],另外一种思路就是利用定时器[3]定时更像图片绘制动画。
后者在绘制过程中可以响应其他事件,因此应用十分广泛。
1.1 定时器技术定时器可以向系统定时发送信号,触发OnTimer函数。
在定时器使用过程中涉及到三个常用函数,分别对应着使用定时器的三个步骤。
(1)创建定时器。
创建定时器使用SetTimer函数。
MFC中提供两个SetTimer函数,一个是全局函数,可以在程序的任意位置调用。
我们更常使用的是第二种SetTimer函数,由CWnd类重载。
函数有三个参数,分别是定时器编号、时间间隔和回调函数[4]地址。
(2)处理定时器信号。
MFC在OnTimer函数中处理定时器信号。
OnTimer函数具有一个参数,是捕捉到的定时器编号。
我们可以利用其区分不同的定时器信号,执行不同代码。
(3)销毁定时器。
定时器也会占用一定的系统资源,所以必须及时销毁不用的定时器,否则会影响系统运行效率。
MFC中使用KillTimer函数销毁定时器,该函数参数就是待销毁的定时器编号。
1.2 双缓冲技术在Windows平台上,应用程序的图像设备接口被抽象化为设备上下文(Device Content,DC)。
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 定时器的使用点击连接(按住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);}上面只是一个简单的演示,希望对大家有帮助吧。
002MFC定时器SetTimer函数用法总结
MFC定时器SetTimer函数用法总结CWnd类的SetTimer成员函数只能在CWnd类或其派生类中调用,而API函数SetTimer则没有这个限制,这是一个很重要的区别。
1、启动定时器。
启动定时器就需要使用CWnd类的成员函数SetTimer。
CWnd::SetTimer的原型如下:参数nIDEvent指定一个非零的定时器ID;参数nElapse指定间隔时间,单位为毫秒;参数lpfnTimer指定一个回调函数的地址,如果该参数为NULL,则WM_TIMER消息被发送到应用程序的消息队列,并被CWnd对象处理。
如果此函数成功则返回一个新的定时器的ID,我们可以使用此ID通过KillTimer成员函数来销毁该定时器,如果函数失败则返回0。
通过SetTimer成员函数我们可以看出,处理定时事件可以有两种方式,一种是通过WM_TIMER消息的消息响应函数,一种是通过回调函数。
如果要启动多个定时器就多次调用SetTimer成员函数。
另外,在不同的CWnd 中可以有ID相同的定时器,并不冲突。
2、为WM_TIMER消息添加消息处理函数,或者定义回调函数。
如果调用CWnd::SetTimer函数时最后一个参数为NULL,则通过WM_TIMER 的消息处理函数来处理定时事件。
添加WM_TIMER消息的处理函数的方法是,在VS2010工程的类向导,选择要添加定时器的类,在消息列表中找到WM_TIMER消息,添加消息处理函数。
添加后,cpp文件中会出现类似如下内容:C++代码BEGIN_MESSAGE_MAP(CExample44Dlg, CDialogEx)......ON_WM_TIMER()END_MESSAGE_MAP()void CExample44Dlg::OnTimer(UINT_PTR nIDEvent){// TODO: Add your message handler code here and/or call defaultCDialogEx::OnTimer(nIDEvent);}之后就可以在OnTimer函数中进行相应的处理了。
mfc ctime的用法
mfc ctime的用法
MFCCTime是一种日期和时间类,用于在MFC应用程序中管理日期和时间。
它提供了许多有用的方法,例如获取当前日期和时间、格式化日期和时间字符串、比较两个日期和时间等。
使用CTime类,可以轻松地在MFC应用程序中处理日期和时间。
CTime类的构造函数有多种重载形式,可以接受不同的参数类型。
例如,可以使用当前日期和时间创建一个CTime对象,也可以使用表示日期和时间的整数值创建一个CTime对象。
还可以使用字符串表示的日期和时间创建CTime对象。
CTime类还提供了许多有用的方法,例如GetYear、GetMonth、GetDay、GetHour、GetMinute和GetSecond,可以从CTime对象中获取日期和时间的各个部分。
还可以使用Format方法将CTime对象格式化为字符串表示形式,并使用ParseDateTime方法将字符串解析为CTime对象。
CTime类还提供了一些与日期和时间比较相关的方法,例如Compare、operator<、operator>、operator==等。
这些方法可以帮助开发人员比较两个日期和时间,以确定它们的关系。
总之,MFC CTime是一种非常有用的日期和时间类,可以帮助开发人员在MFC应用程序中轻松处理日期和时间。
掌握CTime的用法可以使开发人员更加高效地编写MFC应用程序。
- 1 -。
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定时器使用
返回
步骤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++提供并
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下面这段代码的主要功能是设置两个时钟定时器,一个间隔是1ms,一个间隔是2s。每执行一次,把当前系统时钟值输入文件“cure.out”中,以比较该定时器的精确度。
//定义1ms和2s时钟间隔,以ms为单位
# define ONE_MILLI_SECOND 1
1、SetTimer定义在那里?
SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。
SetTimer有两个函数。一个是全局的函数::SetTimer()
UINT SetTimer(
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。
uDelay:延迟时间;
uResolution:时间精度,在Windows中缺省值为1ms;
lpFunction:回调函数,为用户自定义函数,定时调用;
dwUser:用户参数;
uFlags:标志参数;
TIME_ONESHOT:执行一次;
#define IDTIMER1 1
#define IDTIMER2 2
(2)在CMainFrame的OnCreate函数中定义两个定时器的属性。
SetTimer(TIMEID1,5000,0);
SetTimer(TIMEID2,7000,0);
(3) CMainFrame中对WM_TIMER进行响应。
MFC中定时器的使用
在/doc/">程序中我们经常要使用定时刷新的功能,典型的应用是在信息管理系统中表单要跟着数据库中的数据变动。MFC提供了定时器来完成这个功能。
在MFC中和定时器相关的有三个函数:
UINT SetTimer( UINT nIDEvent, UINT nElapse,
同时,SetTimer()在CWnd中也有定义,即SetTimer()是CWnd的一个成员函数。CWnd的子类可以调用该函数,来设置触发器。
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
//定义分辨率
UINT wAccuracy;
//定义定时器句柄
UINT TimerID_1ms,TimerID_2s;
//打开输出文件“cure.out”
CCureApp::CCureApp():fout(“cure.out”, ios::out)
再看看OnTimer()
afx_msg void OnTimer( UINT nIDEvent );
ontimer()是响应CWnd对象产生的WM_Timer消息。nIDEvent表示要响应TIMER事件的ID。
二、Timer事件的使用:
由以上的分析,我们应该很清楚,如何来使用Timer事件。假定我们在视图上画一个渐变的动画。我们首先在菜单栏上添加一个菜单项,给这个菜单添加命令响应:
UINT nElapse: 定义刷新时间,即间隔多长时间刷新一次,单位是毫秒。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD):
这个回调函数中实现刷新时所做的操作,如在数据库中读取数据。但是我们大多数时候不在这里实现,而是在OnTimer中。
# define TWO_SECOND 2000
//定义时钟分辨率,以ms为单位
# define TIMER_ACCURACY 1
//定义时间间隔
UINT wTimerRes_1ms,wTimerRes_2s;
参数含义:
nIDEvent:是指设置这个定时器的iD,即身份标志,这样在OnTimer()事件中,才能根据不同的定时器,来做不同的事件响应。这个ID是一个无符号的整型。
nElapse
是指时间延迟。单位是毫秒。这意味着,每隔nElapse毫秒系统调用一次Ontimer()。
void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)
同样的,我们再看看KillTimer()和OnTimer()的定义:
KillTimer同SetTimer()一样,他也有两个,一个是全局的::KillTimer(),另一个是CWnd的一个函数。他的声明如下:
//全局函数
BOOL KillTimer(
HWND hWnd, // handle of window that installed timer
pView->SetTimer(1,1000,NULL);//pView是视图类的指针,这里是在视图类当中设置一个定时器。
添加完毕,再给视图类添加一个WM_Timer事件的相应。在OnTimer()函数中编写汉书,进行相应。
如此,就能做出动画。
用多媒体定时器
函数功能:
SetTimer用来定义一个定时器的属性,如改定时器的ID,刷新时间,处理函数。
OnTimer实际时系统定义消息用来响应WM_TIMER消息,在这里可以实现对多定时器中的各个定时器分别响应,这里才时定时/doc/">程序大展宏图的地方。 字串2
KillTimer用来结束一个定时器。 字串1
微软公司在其多媒体Windows中提供了精确定时器的底层API支持。利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用。利用多媒体定时器的基本功能,可以通过两种方法实现精确定时。
1.使用timeGetTime()函数
break;
}
default:
;
}
CFrameWnd::OnTimer(nIDEvent);
}
(4)在CMainFrame的析构函数中添加
KillTimer(IDTIMER1);
KillTimer(IDTIMER2);
本篇文章来源于 忒好程序员| 原文链接:/html/doc/kfyy/20071226/1105.html
Timer事件,即定时器事件,是在游戏编程中,经常使用的一个事件。借助它可以产生定时执行动作的效果。这篇文章,就和大家一起探讨一下如何使用SetTimer()函数。
{
AfxMessageBox("定时器1!");
break;
} 字串1
case TIMEID2:
{
AfxMessageBox("定时器2!");
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事件。
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent) {
case TIMEID1:
UINT uIDEvent // timer identifier
);
//CWnd函数
BOOL KillTimer( int nIDEvent );
这两个函数表示的意思是将iD为nIDEVENT的定时器移走。使其不再作用。其用法如同SetTimer()一样。
void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) );
afx_msg void OnTimer( UINT nIDEvent );
BOOL KillTimer( int nIDEvent );
参数说明:
UINT nIDEvent:定时器的ID,给定时器唯一的身份验证,如果在一个/doc/">程序中有多个定时器可以用这个ID来确定是那个定时器发送的消息。
该函数定时精度为ms级,返回从Windows启动开始所经过的时间。由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。
2. 使用timeSetEvent()函数
利用该函数可以实现周期性的函数调用。函数的参数说明如下:
TIME_PERIODIC:周期性执行。
具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在lpFunction回调函数中(如:定时采样、控制 等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用 timeKillEvent()将之释放。