MFC定时器Timer的使用

软件开发大郭
0 评论
/
2 阅读
/
2015 字
22 2023-11
分类:

mfc的定时器功能,可以让程序周期性的执行一些功能。如定时采集数据,刷新界面等。我认为的好处,就是避免了使用多线程去实现那些功能。 下面介绍如何使用定时器Timer

相关函数 启动定时器

UINT_PTR SetTimer(
  [in, optional] HWND      hWnd,
  [in]           UINT_PTR  nIDEvent,
  [in]           UINT      uElapse,
  [in, optional] TIMERPROC lpTimerFunc
);

终止定时器

BOOL KillTimer(
  [in, optional] HWND     hWnd,
  [in]           UINT_PTR uIDEvent
);

响应定时器的办法:定义Timerproc函数传入SetTimer的lpTimerFunc参数

TIMERPROC Timerproc;

void Timerproc(
  HWND unnamedParam1,
  UINT unnamedParam2,
  UINT_PTR unnamedParam3,
  DWORD unnamedParam4
)

如果 lpTimerFunc 为 NULL,系统会将 WM_TIMER消息发布到应用程序队列,对于mfc应用程序,只需要在OnTimer函数中进行处理就可以了

使用方法

双击开始按钮,添加事件处理程序,使用SetTimer创建定时器,其中1是创建的定时器ID,100是每个100毫秒触发一次定时器(发送WM_TIMER消息)

void CTestTimerDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    SetTimer(1,100,NULL);
}

双击停止按钮,添加事件处理程序,使用KillTimer销毁定时器,1是所要销毁的定时ID。

void CTestTimerDlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    KillTimer(1);
}

实现OnTimer

通过覆写OnTimer函数来实现定时器触发后的操作,增加进度条滚动进度

在CTestTimerDlg类中声明OnTimer函数

public:
        void OnTimer(UINT_PTR nIDEvent);

实现定时器函数,通过switch语句判断不同定时器ID对应的不同操作(可以同时设置多个定时器)

void CTestTimerDlg::OnTimer(UINT_PTR nIDEvent){
    switch (nIDEvent)
    {
    case 1:
        if (m_progress.GetPos() < 100)
        {
            m_progress.SetPos(m_progress.GetPos() + 1);
        }else{
            m_progress.SetPos(0);
        }
        break;
    default:
        break;
    }
}

最重要的,建立定时器消息映射。没有以下语句,则即便定时器被成功创建,也不会执行OnTimer函数

BEGIN_MESSAGE_MAP(CTestTimerDlg, CDialog)
    ...
    ON_WM_TIMER()
END_MESSAGE_MAP()
标签:
    暂无数据