您的位置:首页 > 其它

MFC定时器使用--SetTimer && KillTimer && 进度条CProgressCtrl

2013-06-04 08:58 483 查看
这里以进度条为实例,来使用MFC的定时器。

用SetTimer函数 创建定时器

先看一个实例,启动计时器,在类结构里面定义定时器id:
class CDlgOncloseDlg : public CDialogEx
{
// Construction
public:
	CDlgOncloseDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	enum { IDD = IDD_DLGONCLOSE_DIALOG };

    enum
    {
        ID_TIMER_1 = 100,
        ID_TIMER_2 = 101,
    };
然后再你需要的时机依次启动各个计时器:

BOOL CDlgOncloseDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// Add "About..." menu item to system menu.
	// TODO: Add extra initialization here

    this->SetTimer(ID_TIMER_1, 5000, NULL);
然后重写OnTimer,OnTimer函数中这样写:

void CDlgOncloseDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
    default:
        break;
    case ID_TIMER_1:
        PostMessage(WM_CLOSE);
        break;
    }
    CDialogEx::OnTimer(nIDEvent);
}


SetTimer函数的用法

1) 函数原型及变形
Creates a timer event.

 
UINT SetTimer(
   UINT nIDEvent,
   UINT nElapse,
   void ( CALLBACK* lpfnTimer )(HWND, UINT, UINT, DWORD) = NULL 
) throw();
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。
2)函数生成方法在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。然后在函数里添加代码,让代码实现功能。
每隔一段时间就会自动执行一次。
3) 回调函数的格式
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);


KillTimer

取消定时器不再使用定时器后,我们应该调用KillTimer来取消定时。

Destroys a timer event created by CWindow::SetTimer.

 
BOOL KillTimer(
   UINT nIDEvent 
) throw();

定时器实例,操作一个进度条控件

在类里添加一个进度条以及计数:
CProgressCtrl m_Process;
    int count;
然后,初始化范围和步进值:
this->SetTimer(ID_TIMER_1, 1000, NULL);

    m_Process.SetRange(0, 100);
    m_Process.SetStep(10);
    count = 0;
再修改定时器处理函数:
void CDlgOncloseDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    switch(nIDEvent)
    {
    default:
        break;
    case ID_TIMER_1:
        //PostMessage(WM_CLOSE);
        count++;
        TRACE("count is %d", count);
        m_Process.StepIt();

        int pos = m_Process.GetPos();
        if(pos >= 100)
        {
            PostMessage(WM_CLOSE);
        }

        break;
    }
    CDialogEx::OnTimer(nIDEvent);
}
也就是说10s之后,进度条满,ok,关闭对话框。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: