MFC的计时器Timer

时间:2022-03-01 20:36:24

计时的表征利用进度控件ProgressControl,其对应的类为CProgressCtrl。

(关于进度控件的介绍)

进度条的创建

virtual BOOL Create( // 创建进度条

  DWORD dwStyle, // 风格

  const RECT& rect, // 进度条的位置和大小的矩形

  CWnd* pParentWnd, // 父窗口的指针

  UINT nID // 进度条ID

);

进度控件类的其他常用成员函数有:

l 设置进度范围(默认为0~100):voidSetRange( short nLower, short nUpper );

l 获取进度范围:voidGetRange( int& nLower, int& nUpper );

l 设置当前位置(初始为0):int SetPos(int nPos );

l 获取当前位置:intGetPos( );

l 设置步长(默认为10):intSetStep( int nStep );

l 获取步长:intGetStep() const;

l 前进一步:intStepIt( );

 

从工具箱中添加进度条控件之后,在对话框类C…Dlg的头文件定义进度控件类对象的类变量

    CProgressCtrl *prog;

并在对话框类C…Dlg的代码文件里的初始化对话框响应函数OnInitDialog中,利用GetDlgItem对其进行初始化:

    prog = (CProgressCtrl *)GetDlgItem(IDC_ROGRESS);

 

设置倒计时的事件处理,在里面设置进度条的当前位置为100,并启动计数器:

void CSockDlg::OnProgressStart()

{

  prog->SetPos(100);

  prog->SetStep(-10);//设置步长为负数

  SetTimer(1, 500, NULL);

}

其中的SetTimer用于设置计时器,它是CWnd的成员函数,其函数原型为:

UINT SetTimer( UINT nIDEvent, UINT nElapse,

void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT,DWORD) );

l  nIDEvent为此计时器的ID。因为一个应用程序可以设置多个计时器,为了在响应时区分它们,必须各有一个ID。在本程序计时器只需要一个,所以取nIDEvent = 1即可。

l  nElapse为间隔时间,单位为毫秒(1/1000秒)。

l  lpfnTimer为应用程序提供的处理WM_TIMER消息的回调函数,一般取为NULL,这时WM_TIMER消息由CWnd派生类的对应消息响应函数来处理。

在设置了计时器后,系统会按指定的时间间隔发送WM_TIMER消息给应用程序窗口,可在计时器消息响应函数OnTimer中作需要的处理,在本程序中是让进度条步进。

然后为对话框类CProgressDlg添加计数器消息WM_TIMER的响应函数,在里面让各进度条步进,并在进度条空了之后,停止计数器:

void CSockDlg::OnTimer(UINT_PTR nIDEvent)

{

    // TODO: 在此添加消息处理程序代码和/或调用默认值

    prog->StepIt();

    if (prog->GetPos()<= 0) KillTimer(1);

    CDialog::OnTimer(nIDEvent);

}

 

其中的KillTimer用于删除计时器,它也是CWnd的成员函数,其函数原型为:

BOOL KillTimer( int nIDEvent );