June 04 2009
code by sealplusplus
640K ought to be enought for everybody
-------Bill Gates
Timer
计时器不依赖CPU的时钟速度(应该是有自己的时钟晶震)。。
CWnd::SetTimer();
产生WM_TIMER.消息。在对话框的属性里边,最上边有几个图标。VS2005是第5个图标,然后选择。WM_TIMER消息,自动产生OnTimer()函数,其实手动添加也可以。三个地方,一个是.h不用说了,注意函数头有afx_msg,函数声明。一个是.cpp函数定义。还有一个就是定义消息。在.cpp的消息循环里边,添加ON_WM_TIMER()就行了,因为是系统包含的,所以比较简单。
注意的是参数是毫秒指定周期的。
则就按这个周期一直发送WM_TIMER给窗口,直到用 Cwnd::KillTimer()或者窗口被关闭。
当使用多个计时器的时候,当周期小于100毫秒,计时器之间的周期可能不精确。
WM_TIMER 可以被程序中的其他处理程序函数所阻塞,WM_TIMER消息不累加。
More Detail:
MSND, MSPress 的VC 6.0技术内幕...........
1.设置计时器 在要设置时间计时器的地方调用函数SetTimer()即可 函数原型为UINT SetTimer (UINT nIDEvent, UINT nElapse, void (CALLBACK*
lpfnTimer)(HWND, UINT, UINT, DWORD)) 第一个参数nIDEvent为时间计时器的ID,第二个参数为时间间隔,即每隔多久执行一次 第三个参数为函数指针,每次时间到时就会调用处理,当置为NULL时调用默认的
OnTimer()函数
如: SetTimer(1,1,NULL); SetTimer(2,500,NULL); // 500 means 1/2 second, 100 means 1/10 second
2.计时器处理 如果第三个参数不为NULL,则调用自定义的函数处理 否则调用 void CPickColorDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if (nIDEvent == 1) { CPoint pt; GetCursorPos(&pt); HDC hDC = ::GetDC(NULL); COLORREF clr = ::GetPixel(hDC, pt.x, pt.y); m_red.Format("%d",GetRValue(clr)); m_green.Format("%d",GetGValue(clr)); m_blue.Format("%d",GetBValue(clr)); UpdateData(FALSE); ::ReleaseDC(NULL, hDC); } else if (nIDEvent == 2) { static int i=1; if (i>20) { i=1; } m_progress.SetPos(i); m_ProgressText.SetPos(i); i++; } CDialog::OnTimer(nIDEvent); }
3.停止计时器 调用函数KillTimer()即可 函数原型为:BOOL KillTimer (int nIDEvent) 参数nIDEvent为时间计时器的ID 如: KillTimer(1); KillTimer(2);
|
P.S
可以看出来,消息是MFC或者现在操作系统的本质。如果用定时器去决定函数是不是执行完了,不如发个消息快吧。但是定时器有计时作用是不能忽略的。比如开机后1000000000000 second关机。