在程序中我们往往需要使用计时器,此程序就是实现计时器动态启动和停止的一个例子。程序运行时,nCount不停的增加1直到变成1000。用一个进度条显示完成的百分比。点击Start按钮,nCount开始自增,进度条满之前如果点击Cancel,nCount归零并清空进度条。进度条为零且未Start,Cancel可以退出对话框。
1. 创建如下名对话框,并创建相应的CComputDlg类,并在类中增加如下私有数据成员:
int m_nTimer;
int m_nCount; //在计算过程中不断递增,它除以nMaxCount得到完成百分比
enum{nMaxCount = 100000};
2. 在CComputDlg构造函数中添加一行代码:
m_nCount = 0;//确保没有启动计算进程的情况下,Cancel按钮仍然可以工作
一定要在注释行 //}}AFX_DATA_INIT之外添加该行
3. 映射OnStart()消息函数
void CComputeDlg::OnStart()
{
// TODO: Add your control notification handler code here
MSG message;
m_nTimer = SetTimer(1, 100, NULL);//1/10 second
ASSERT(m_nTimer != 0);
GetDlgItem(IDC_START)->EnableWindow(FALSE);//禁用start按钮
volatile int nTemp;
m_nCount = 1;
CProgressCtrl* pBar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pBar->SetRange(1,100);
pBar->SetPos(1);
}
4. 添加OnCancel()消息函数
void CComputeDlg::OnCancel()
{
// TODO: Add extra cleanup here
if(GetDlgItem(IDC_START)->IsWindowEnabled() == TRUE)
{
//prior to Start button
CDialog::OnCancel();
}
else
{
// m_nCount = nMaxCount;
KillTimer(m_nTimer);
m_nCount = 0;//force exit from OnStart
CProgressCtrl* pBar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pBar->SetPos(m_nCount*100/nMaxCount);
GetDlgItem(IDC_START)->EnableWindow(TRUE);//起用start按钮
}
/* CDialog::OnCancel();*/
}
5. 添加WM_TIMER消息处理函数
void CComputeDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CProgressCtrl* pBar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
pBar->SetPos(m_nCount);
if(m_nCount == 100)
{
KillTimer(1);//1标识计时器的编号,第一个
m_nCount = 1;
pBar->SetPos(1);
GetDlgItem(IDC_START)->EnableWindow(TRUE);
}
CDialog::OnTimer(nIDEvent);
}
只要在程序中触发弹出了该对话框,就可以使用了J