定时器

Static控件

写一个Static控件,ID设置为【IDC_STATIC_TIME】,添加成员变量为【m_szTime】,描述文字写成【时间:还剩 30 秒】

定时器初始化

在主界面对话框的【属性】-【消息】,选择【WM_TIMER】增加一个【OnTimer()】。

在对话框的【.cpp】文件最顶部定义一个宏【#define TIMER_ELAPSE_ID 100】

在OnInitDialog()函数中增加【SetTimer(TIMER_ELAPSE_ID, 1*1000, NULL);】

但是在控件显示前,要对static进行初始化,需要写【m_szTime = _T("时间:还剩 30 秒");】

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

	// TODO: 在此添加额外的初始化代码
	m_szTime = _T("时间:还剩 30 秒");
	UpdateData(FALSE);
	SetTimer(TIMER_ELAPSE_ID, 1 * 1000, NULL);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

OnTimer

在OnTimer()函数里添加代码。

m_lefttime是自定义为30秒,每次都会减少。当减少为0,就退出定时器。

void CMFC08OnTimerDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	// TODO: Add your message handler code here and/or call default
	switch (nIDEvent)
	{
	case TIMER_ELAPSE_ID:  // 接收消息
		UpdateData(TRUE);
		m_szTime.Format(_T("时间:还剩: %2d 秒"), --m_lefttime);
		UpdateData(FALSE);
		if (m_lefttime == 0)      // 减少为0
		{
			KillTimer(nIDEvent);   // 结束定时器
			UpdateData(TRUE);
			CDialog::OnOK();
		}
		break;
	default:
		break;
	}

	CDialogEx::OnTimer(nIDEvent);
}

m_lefttime在主界面对话框的【.h】定义。

int m_lefttime;

m_lefttime在构造函数里进行初始化。

CMFC08OnTimerDlg::CMFC08OnTimerDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFC_08_ONTIMER_DIALOG, pParent)
	, m_szTime(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_lefttime = 30;  // 初始化
}
原文地址:https://www.cnblogs.com/17bdw/p/10354867.html