现在的位置: 首页 > 综合 > 正文

Timer……

2013年08月02日 ⁄ 综合 ⁄ 共 1592字 ⁄ 字号 评论关闭

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关机。

抱歉!评论已关闭.