计时的表征利用进度控件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 );