最简单的开始写,毫秒级时钟。
用CWnd::SetTimer设置定时器,然后在窗口上添加WM_TIMER事件,接下来实现OnTimer响应函数就可以了...
SetTimer(1,1,NULL); // 第一个是定时器标号,第二个是每隔多长时间运行一次,单位毫秒,第三个本来是定时器处理函数的,这里用NULL的意思是直接使用OnTimer响应函数...
void OnTimer( UINT nIDEvent ); // 响应函数声明
我把得到的当前时间存到一个(cstring)str字符串内,然后用MessageBox显示出来,然后我想把当前时间减掉15分钟存到另一个字符串str2内再将其输出,请问-15分钟这个过程怎么实现?比如str存的时间为22:10分,我想在str2中存入11:55分,我要怎么做?
CTime today=CTime::GetCurrentTime() ;
CTimeSpan ts(0,0,15,0);//they are corresponding with the variables:day,hour,minute,second
CTime date=today-ts;
CString ss=date.Format( "%Y-%m-%d %H-%M-%S ");
void CALLBACK EXPORT TimerProc(
HWND hWnd, // handle of CWnd that called SetTimer
UINT nMsg, // WM_TIMER
UINT nIDEvent // timer identification
DWORD dwTime // system time
){}
#define TIME_SEC 1
#define TIME_MIN 2
然后调用SetTimer设定两个计时器
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ;SetTimer (hwnd, TIMER_MIN, 600, NULL)
UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc ) ;
其中
hWnd是和timer关联的窗口句柄,此窗口必须为调用SetTimer的线程所有;如果hWnd为NULL,没有窗口和timer相关联并且nIDEvent参数被忽略
nIDEvent是timer的标识,为非零值;如果hWnd为NULL则被忽略;如果hWnd非NULL而且与timer相关联的窗口已经存在一个为此标识的timer,则此次SetTimer调用将用新的timer代替原来的timer。timer标识和窗口相关,两个不同的窗口可以拥有nIDEvent相同的timer
uElapse是以毫秒指定的计时间隔值,范围为1毫秒到4,294,967,295毫秒(将近50天),这个值指示Windows每隔多久时间给程序发送WM_TIMER消息。
lpTimerFunc是一个回调函数的指针,俗称TimerFunc;如果lpTimerFunc为NULL,系统将向应用程序队列发送WM_TIMER消息;如果lpTimerFunc指定了一个值,DefWindowProc将在处理WM_TIMER消息时调用这个lpTimerFunc所指向的回调函数,因此即使使用TimerProc代替处理WM_TIMER也需要向窗口分发消息。
关于KillTimer对消息队列中剩余未处理的WM_TIMER消息的影响,MSDN和Programming Windows上的说法完全相反。MSDN的说法很干脆:The KillTimer function does not remove WM_TIMER messages already posted to the message queue. 而petzold则说 The KillTimer call purges the message queue of any pending WM_TIMER messages. Your program will never receive a stray WM_TIMER message following a KillTimer call.(KillTimer消除消息队列中任何未处理的WM_TIMER消息,调用KillTimer后你的程序永远不会收到一条“漂泊游荡”的WM_TIMER消息)
lParam为指向TimerProc的指针,如果调用SetTimer时没有指定TimerProc(参数值为NULL),则lParam为0(即NULL)。
可以通过在窗口过程中提供一个WM_TIMER case处理这个消息,或者,默认窗口过程会调用SetTimer中指定的TimerProc来处理WM_TIMER消息
#define ID_TIMER 1 SetTimer(hWnd,ID_TIMER,1000,NULL) ; KillTimer(hWnd,ID_TIMER) ; |
VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) { //处理WM_TIMER讯息 } |
SetTimer(hWnd,ID_TIMER,1000,TimerProc) ; KillTimer(hWnd,ID_TIMER) ; |
UINT_PTR iTimerID ; iTimerID = SetTimer(NULL,0,1000,TimerProc) ; KillTimer(NULL,iTimerID) ; |
#define TIMER_SEC 1 #define TIMER_MIN 2 然后使用两个 SetTimer 来设定两个计时器: SetTimer (hwnd, TIMER_SEC, 1000, NULL) ; SetTimer (hwnd, TIMER_MIN, 60000, NULL) ; WM_TIMER 的处理如下所示: case WM_TIMER: switch (wParam) { case TIMER_SEC: // 每秒一次的处理 break ; case TIMER_MIN: // 每分钟一次的处理 break ; } return 0 ; |
KillTimer(TIMEID2);