Using Timers in MFC Applications
Timer Events in MFC Applications
Event timers are always handy to have around and useful in nearly every project. When a timer is readily available, such as the Timer control in Visual Basic, you find all kinds of reasons to use one in an application. The lack of a timer object in MFC is, in my opinion, a serious oversight.
Luckily, Microsoft Windows NT/95 systems provide a number of timers for use by application programs. This tutorial provides information on how to install timers in your MFC application, and how to start, process and stop the timers.
In the final section of the tutorial, we develope a simple timer project which is capable of rough animation of an icon in the dialog window. This project is useful in any compute or I/O bound application, and illustrates the techniques involved with installing and using a system timer.
These steps were developed and tested on a WindowsNT 4.0 workstation and Windows95 using VisualC++ 4.2 with Microsoft Foundation Classes.
Installing a Timer
- In the header file of the dialog using the timer,
- Add a message number for each timer needed:
#define
IDT_TIMER_0
WM_USER + 200
#define
IDT_TIMER_1
IDT_TIMER_0 + 1
- Add the timer interrupt handler
OnTimer (UINT TimerVal)
to the Generated Message Map:
- locate the section under Implementation where the AFX_MSG message map is declared (usually begins with the line OnInitDialog());
- add a line just after the last line in the message map (just before the "//}}AFX_MSG"):
afx_msg
void
OnTimer (UINT TimerVal);
- This should be the last entry in the message map.
- In the dialog implementation (.cpp) file,
- Locate the dialog class start
- Find the line starting "BEGIN_MESSAGE_MAP"
- After the last entry in the message map (before the line "//}}AFX_MSG_MAP"), add
ON_WM_TIMER ( )
Starting the timer
To start the timer, you must issue a SetTimer command:
t-number = SetTimer (t-message, t-interval, NULL)
where:
t-message
The message number assigned for processing the timer request.
This is referred to as IDT_TIMER_0 in the installation instructions.t-interval
The timer duration, in mSec.
t-number
The system timer number assigned to this event, or 0 if no timers available.
For Example:
UINT StartTimer (UINT TimerDuration)
{
UINT TimerVal;
TimerVal = SetTimer (IDT_TIMER_0, TimerDuration, NULL);
if (TimerVal == 0)
{
MessageBox ("Unable to obtain timer",
"IDT_TIMER_0",
MB_OK|MB_SYSTEMMODAL);
}
return TimerVal;
}// end StartTimer
To start the timer, pass it the value of the timer duration, in milliseconds (mSec). If the returned value is non-zero, the timer has been initialized.
Note: You must save the assigned timer value in order to stop the timer, and also to know which timer to process in a multi-timer application.
Stopping the Timer
To stop the timer, issue the KillTimer command:
t-result = KillTimer (t-number);
where:
t-number
The system timer number from either the SetTimer or OnTimer methods.
t-result
The boolean result of the operation, TRUE indicating success.
For Example:
BOOL StopTimer (UINT TimerVal)
{
//
// Stop the timer
//
if (!KillTimer (TimerVal))
{
return FALSE;
}
//
// Place clean-up code following this point.
//
return TRUE;
} // end StopTimer
Processing Timer Events - The OnTimer Method
After the timer has been started, the OnTimer event will be called each time the timer counts down to zero (reaches terminal count) from the requested value. This event is asynchronous to the timer - a message is placed in the message queue of the calling process and the timer is automatically restarted.
The timer can be stopped (refer to Stopping the Timer) upon entry to the OnTimer routine, or left to run if the event will not occur again before processing the OnTimer routine has completed.
The OnTimer method will be executed each time the timer reaches terminal count. The code in this method should be short and concise; it should be code which must be executed each time the timer reaches its terminal count, such as changing the view of an animated drawing or icon, or setting a flag to process latter, or starting a thread to handle the more complex functions.
Example:
void OnTimer (UINT TimerVal)
{
//////////////////////////////////////////////
//
// Stop the timer
//
//////////////////////////////////////////////
if (!KillTimer (TimerVal))
{
}
//////////////////////////////////////////////
//
// Process the event
//
//////////////////////////////////////////////
//////////////////////////////////////////////
//
// Restart the timer, if needed, before exiting
//
//////////////////////////////////////////////
}
Multiple Timers
The OnTimer method is passed an unsigned integer (UINT) to identify the timer which is interrupting. The value of this timer may be used to stop the associated timer. It can also be used in a multiple timer environment to determine what type of processing must occur.
Example:
Assumptions:
- The timers are started using the example in the section on Installing a Timer.
- The timer values are placed sequentially into the array ATimer, as follows:
- ATimer [0] = StartTimer (200); // a 200 mSec timer
- ATimer [1] = StartTimer (500); // a 500 mSec timer
void OnTimer (UINT TimerVal)
{
int Index;
/////////////////////////////////////////////////////////////////////////////
//
// Check timer number 0
//
////////////////////////////////////////////////////////////////////////////
if (TimerVal == ATimer[0])
{
//
// Process timer 0 message!
//
return;
}
////////////////////////////////////////////////////////////////////////////
//
// check timer number 1
//
////////////////////////////////////////////////////////////////////////////
if (TimerVal == ATimer[1])
{
//
// Process timer 1 message!
//
return;
}
////////////////////////////////////////////////////////////////////////////
//
// Not timer number 0 or 1
//
////////////////////////////////////////////////////////////////////////////
if (!KillTimer (TimerVal))
{
}
CString Message;
Message.format("Unkown timer interrupt: %u", TimerVal);
MessageBox (Message,"OnTimer",MB_OK|MB_SYSTEMMODAL);
} // end OnTimer
From: https://www.developer.com/net/cplus/article.php/603531/Using-Timers-in-MFC-Applications.htm
Using Timers in MFC Applications的更多相关文章
- 基于VC的MFC界面开发
教你熟悉VC6.0创建一个可视化软件的过程 UpdateData(TRUE);//将输入数据赋给文本框变量. UpdateData(FALSE);//将内容显示在文本框中 AfxMessageBox( ...
- 区别:Use MFC In A Shared DLL 和 Use MFC In A Static Library
摘自:Programming Windows with MFC, 2nd Edition Choosing Use MFC In A Shared DLL minimizes your applica ...
- 一些非常好的VC++/MFC开源项目链接
Introduction List of some of the best Open Source projects written in VC++/MFC. Background Codeproje ...
- Some Very Good VC++/MFC Resources Besides Codeproject.com
Some Very Good VC++/MFC Resources Besides Codeproject.com http://www.naughter.com/ (VC++/MFC huge co ...
- 基于MFC的Media Player播放器的制作(4---功能实现代码)
| 版权声明:本文为博主原创文章,未经博主允许不得转载. PandaPlayerDlg.h // PandaPlayerDlg.h : header file // //{{AFX_INCLUDE ...
- 第六篇--MFC美化界面
1.MFC如何设置背景颜色 首先,为对话框添加WM_CTLCOLOR消息,方法为:右击Dialog窗口 --> Class Wizard --> Messages --> WM_CT ...
- MFC 学习笔记
MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...
- C++的简单“五子棋”游戏,只是核心代码,资源代码未添加
ChessBoard.h #ifndef __CHESS_BOARD_H__ #define __CHESS_BOARD_H__ #include "DataStruct.h" # ...
- C++ 使用SQLite
1.SQLite是一个完全独立的.不需要服务器.不要任何配置.支持SQL的.开源的文件数据库引擎.源代码和支持可以登录:http://www.sqlite.org/ 1.1.下载sqlite3.d ...
随机推荐
- .net加载失败的程序集重新加载
在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方 ...
- BrowserLog——使用Chrome控制台作为Log查看器
Chrome控制台是十分强大的,即使将它作为一个log查看器也是非常强大的,BrowserLog就是一个.net下的把Chrome作为log输出的程序包. 原理非常简单,server端将log数据通过 ...
- LINUX 内核守护进程
http://alfred-sun.github.io/blog/2015/06/18/daemon-implementation/
- linux无锁化编程--__sync_fetch_and_add系列原子操作函数
linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础. 下面的东西整理自网络.先感谢大家的分享! __sync_fetch_and_add系列的命令,发现这个系列命令 ...
- kernel logo到开机动画之间闪现黑屏(android 5.X)
在BootAnimation開始画图之前,会先做一次clear screen的动作,避免出现前面的图干扰到BootAnimation的显示. 通过check main_log先确认播放开机动画是哪个f ...
- WCF技术我们应该如何以正确的方式去学习掌握
一.WCF技术我该如何学习? 阿笨的回答是:作为初学者的我们,那么请跟着阿笨一起玩WCF吧,阿笨将带领大家如何以正确的姿势去掌握WCF技术.由于WCF技术知识点太多了,就纯基础概念性知识都可以单独出一 ...
- 有谁知道Delphi中"窗口"的创建过程?
求助:有谁知道Delphi中窗口的创建过程,此“窗口”不仅仅指 TForm 类型, 还包括一般的窗口控件,如TButton,TEdit等等,希望有能够十分详细的运作 过程,比如说CreatPara ...
- 基于TQ2440和Qemu的GDB+串口调试(1)
作者 彭东林 pengdonglin137@163.com 平台 TQ2440 + Linux-4.10.17 Qemu(vexpress-ca9) + Linux-4.10.17 概述 下面 ...
- WordPress主题开发实例:显示最新发表文章
实现效果 制作网站的时候,想在页面左栏显示最新发表的文章,如: 一.先开启侧边栏工具,在functions.php加上 $args = array( 'name' => __( '分类侧边栏') ...
- 让Less在Dreamweaver中高亮显示
装的Dreamweavercs6还是没支持less啊,试过几种方法,感觉还是插件比较直接, 下载插件:http://download.csdn.net/download/lml_231/8556517 ...