MFC中定时器的使用有两种方法:
- 消息通知的方法;
- 回调函数的方法;
消息通知的方法比较简单,只需要在控件界面生成一个OnTimer的消息映射函数就行。
以在界面生成两个定时亮灭的红绿灯为例:
首先用画图软件生成两个bmp格式位图,保存至工程的rec目录下,并加载;
然后在界面上放置两个按键和两个picture control控件,如图所示:
注意:picture control控件的type属性要选择为bitmap,且image要选择相应的位图;
采用消息通知方式的代码:
void CTimer1008Dlg::OnBnClickedBtnRed()
{
// TODO: 在此添加控件通知处理程序代码
if (m_nRedID == 0) {
m_nRedID = SetTimer(1, 500, NULL);
} else {
KillTimer(m_nRedID);
m_nRedID = 0;
::ShowWindow(::GetDlgItem(m_hWnd, IDC_Red), SW_HIDE);
}
}
void CTimer1008Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
HWND hRed;
int nShow;
if (nIDEvent == m_nRedID) {
hRed = ::GetDlgItem(m_hWnd, IDC_Red);
if (::IsWindowVisible(hRed)) {
nShow = SW_HIDE;
} else {
nShow = SW_SHOW;
}
::ShowWindow(hRed, nShow);
}
CDialogEx::OnTimer(nIDEvent);
}
采用回调函数方式的代码如下:
void CTimer1008Dlg::OnBnClickedBtnGreen()
{
// TODO: 在此添加控件通知处理程序代码
if (m_nGreenID == 0) {
m_nGreenID = SetTimer(2, 1000, TimerProc);
}
else {
KillTimer(m_nGreenID);
m_nGreenID = 0;
::ShowWindow(::GetDlgItem(m_hWnd, IDC_green), SW_HIDE);
}
}
void CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT uID, DWORD dwTimer)
{
HWND hGreen = ::GetDlgItem(hWnd, IDC_green);
int nShow;
if (::IsWindowVisible(hGreen)) {
nShow = SW_HIDE;
} else {
nShow = SW_SHOW;
}
::ShowWindow(hGreen, nShow);
}