windows下MFC定时器开发学习

  1. 在VS2010中新建一个项目,Visual C++->MFC->MFC应用程序,命名为“Timer”->确定,选择MFC向导建立基于对话框; 2. 在自动生成的对话框模板中,删除所有静态文本控件和按钮控件。从右侧工具箱中添加一个编辑框控件和一个按钮控件,使用默认的IDC_EDIT1和IDC_BUTTON1,编辑框的ReadOnly属性设置True。

  1. 添加OnTimer() 回调函数:

  1. 打开类视图对话框:视图->类视图;

  1. 在类视图中点击需要使用定时器的对话框类,在属性窗口选择消息,在下面的消息函数中选中WM_TIMER,后面选择添加OnTimer函数,如下图所示:

  1. 窗口添加函数后,在头文件和源文件中自动生成OnTimer函数的声明和定义;

  1. 控件操作:

左键点中按钮->外观->Caption->改成"start"

双击按钮:自动生成按钮回调函数 OnBnClickedButtonStart()的声明和定义;

  1. 开始编辑代码:

timerDlg.h 文件中添加如下内容

// 将timer id定义成枚举类型,因为每个成员的值可以自动递增
// 如果写成宏的话,每个宏都得写固定的值,当后续想调整顺序的时候,每个宏的值都得改,会比较麻烦
enum{
    READ_STATUE_TIMER_ID = 0,
    TIMER_ID_1,
    TIMER_ID_2,
    TIMER_ID3,
};

#define READ_STATUE_MS    1000 // 读取状态定时器周期(单位ms)

// 构造函数的声明中添加
class CtimerDlg : public CDialogEx{
private:
    UINT_PTR m_ReadStatuTimer; // 定时器句柄,用于关定时器时使用
    BOOL m_bStart; // 是否启动了定时器
    int m_nTimerCnt; // 当前计数值
};

timerDlg.cpp 文件中修改如下内容

CtimerDlg::CtimerDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CtimerDlg::IDD, pParent){   
    // 添加内容
    m_pReadStatuTimer = NULL;
    m_bStart = FALSE;
    m_nTimerCnt = 0;
}

BOOL CtimerDlg::OnInitDialog()
{
    // 添加内容
    
}

void CtimerDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    m_nTimerCnt++;
    // 更新计数值到EDIT1控件上
    CString str;
    str.Format(_T("%d"),m_nTimerCnt);
    GetDlgItem(IDC_EDIT1)->SetWindowTextW(str);

    CDialogEx::OnTimer(nIDEvent);
}

void CtimerDlg::OnBnClickedButtonStart()
{
    // TODO: 在此添加控件通知处理程序代码
    m_bStart = !m_bStart;
    if (TRUE == m_bStart){
        // 如果点了启动,且定时器没开,则打开定时器
        if (0 == m_pReadStatuTimer){
            m_pReadStatuTimer = SetTimer(READ_STATUE_TIMER_ID, READ_STATUE_MS, 0);
        }

        // 把按钮显示成stop
        GetDlgItem(IDC_BUTTON_START)->SetWindowTextW(_T("stop"));

        // 重新计数
        m_nTimerCnt = 0;
    }
    else{
        // 如果再点了一次时,关定时器
        if (0 != m_pReadStatuTimer){
            KillTimer(READ_STATUE_TIMER_ID);
            m_pReadStatuTimer = 0;
        }

        // 把按钮显示成start
        GetDlgItem(IDC_BUTTON_START)->SetWindowTextW(_T("start"));
    }
}

参考链接:

1、https://www.likecs.com/show-203661610.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 高精度定时器是指能够实现毫秒级别或更高精度的定时器。在MFC中实现高精度定时器可以通过以下步骤实现: 1.创建一个窗口,并通过SetTimer函数设置一个定时器。该函数有两个参数,一个是定时器ID号,一个是定时器的时间间隔。 2.在窗口类中添加一个成员变量,用于保存已经过去的时间。我们可以在WM_TIMER消息处理函数中,每次处理时递增该变量。 3.通过该变量计算出所需的时间,然后进行相应的操作。例如,我们可以将该变量转化为分钟和秒钟,然后在窗口上显示出来。 4.为了提高定时器的精度,可以通过Win32 API函数timeGetTime获取系统时间,然后在WM_TIMER消息处理函数中计算与上一次时间间隔,从而更加精确地计算已经过去的时间。 需要注意的是,高精度定时器会占用系统资源,并且可能存在时间误差。因此,在实现时需要考虑这些因素,并根据实际需求进行调整。 ### 回答2: 高精度定时器是一种能够实现较为精确的时间计量和延时控制的技术,而MFC(Microsoft Foundation Classes)则是基于Windows操作系统的C++类库,提供了GUI界面开发所需要的各种类、函数和控件等工具。将两者结合使用,可以实现用MFC编写的应用程序对时间的更加准确的控制或监测,如毫秒或微秒级别的时间计算和处理等。 要在MFC中实现高精度定时器功能,可以考虑使用Win32 API中提供的计时器函数来进行实现。具体实现步骤如下: 1. 定义计时器变量和时间变量。例如: UINT_PTR m_TimerID; // 计时器ID DWORD m_dwStartTime; // 记录开始时间 DWORD m_dwCurrentTime; // 记录当前时间 DWORD m_dwElapsedTime; // 记录已过时间 2. 创建计时器并开始计时。可以在窗口初始化函数中添加如下代码: m_TimerID = SetTimer(1, 1, NULL); // 1ms间隔 m_dwStartTime = GetTickCount(); // 记录开始时间 3. 处理计时器消息。在窗口消息响应函数中,添加对WM_TIMER消息的处理,如: case WM_TIMER: { m_dwCurrentTime = GetTickCount(); // 记录当前时间 m_dwElapsedTime = m_dwCurrentTime - m_dwStartTime; // 计算已过时间 // 这里可以根据需要进行时间数据的显示、处理等其他操作 } break; 4. 在窗口关闭时停止计时器。可以在窗口关闭函数中添加如下代码: KillTimer(m_TimerID); 以上就是使用高精度定时器实现MFC的简单示例。需要注意的是,由于不同计算机的性能和Windows操作系统的版本等因素可能会影响计时器的精度和稳定性,因此在实际应用中需要针对具体需求进行测试和调整。 ### 回答3: 高精度定时器可以通过MFC的计时器来实现。MFC的计时器是基于Windows API的定时器实现的。Windows API提供了一个SetTimer函数,用于设置定时器MFC的CWnd类继承了Windows API的CWnd类,在此基础上提供了一系列的计时器函数。 使用MFC计时器,首先需要在类声明中添加一个计时器ID,具体实现可以如下: #define TIMER_ID 1 class CMyDlg : public CDialog { public: CMyDlg(CWnd* pParent = NULL); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MYDLG_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); protected: HICON m_hIcon; int m_nCount; afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnBnClickedButtonStart(); afx_msg void OnBnClickedButtonStop(); DECLARE_MESSAGE_MAP() }; 在类声明中添加了一个计时器ID为1。同时,在消息映射中,添加了一个响应定时器事件的函数OnTimer。 void CMyDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == TIMER_ID) { m_nCount++; //每次增加计数 } CDialog::OnTimer(nIDEvent); } OnTimer函数响应计时器事件,其中nIDEvent就是计时器ID。在函数中,我们可以编写计时器事件响应的代码,这里是每次增加计数。 在对话框初始化时就设置计时器: BOOL CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 SetTimer(TIMER_ID, 500, NULL); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } 在OnInitDialog函数中添加代码SetTimer(TIMER_ID, 500, NULL);就可以设置一个500ms的计时器了。 当然,在对话框关闭时,还要记得取消计时器: void CMyDlg::OnBnClickedButtonStop() { // TODO: 在此添加控件通知处理程序代码 KillTimer(TIMER_ID); } 这样,一个MFC的高精度定时器就实现了。其实,在MFC中,还可以使用CWnd::SetTimer来设置定时器,不过与SetTimer函数类似,使用时也需要取消,不然会造成内存泄漏。同时,MFC还提供了更为灵活的计时器功能,可以用来处理其他复杂的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值