实验七 MFC 定时器编程实验
一、预备知识
1、定时器消息
定时器时间到时,向窗口发送 WM_TIMER 消息,应用程序窗口通过处理该消息来对定时器事件进行处理,该消息的参数说明如下:
WM_TIMER
wTimerID = wParam; // 定时器标识符
tmprc = (TIMERPROC *) lParam; // 定时器回调函数的地址
其中,定时器回调函数在使用SetTimer启动定时器时指定,如果没有指定定时器回调函数则可直接通过消息映射处理 WM_TIMER 消息。
2、启动定时器
使用SetTimer函数创建一个定时器,并制定超时时间,然后启动定时器。该函数说明如下:
UINT SetTimer(
UINT nIDEvent, // 定时器标识符
UINT nElapse, // 定时时间,单位是毫秒
void (CALLBACK EXPORT* lpfnTimer) // 定时器回调函数地址
(HWND, UINT, UINT, DWORD)
);
示例代码:
SetTimer(1,200,NULL);
3、销毁定时器
定时器在不使用时要使用KillTimer函数进行销毁,该函数说明如下:
BOOL KillTimer(
intnIDEvent // 定时器标识符
);
示例代码:
KillTimer(1);
二、实验目的
(1) 掌握 Visual Studio 开发环境调试程序的方法;
(2) 熟练使用类向导进行消息映射;
(3) 掌握 MFC 编程模式中定时器的使用方法。
三、实验内容
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
一个窗口,在窗口中间位置绘制一个红色粗实线的矩形,并用交替使用三
种不同样式的画刷填充矩形的内部,每次刷新的时间间隔为 1.0 秒。
单击鼠标左键启动定时器,单击鼠标右键停止定时器。
四、编程实验部分程序及运行结果
(1) 列出定时器操作相关的程序清单
1、WM_PAINT消息的处理
//OnPaint()函数实现用自定义画笔绘制一个矩形
//并调用相应的画刷填充图形内部
voidCDemoDlg::OnPaint()
{
CPaintDCdc(this);
CPen Pen, *pOldPen;
CBrush Brush;
Pen.CreatePen(PS_SOLID, 6, RGB(255, 0, 0));
//m_nStyle用于选择不同的画刷填充图形内部
switch (m_nStyle)
{
case 0:
Brush.CreateSolidBrush(RGB(0,0,255));
break;
case 1:
Brush.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 255));
break;
case 2:
Brush.CreateSolidBrush(RGB(0, 255, 0));
break;
default:
break;
}
pOldPen = dc.SelectObject(&Pen);
dc.SelectObject(&Brush);
dc.Rectangle(100, 50, 450, 260);
dc.SelectObject(pOldPen);
}
2、WM_LBUTTONDOWN消息的处理
//当按下鼠标左键时启动定时器
voidCDemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetTimer(1, 1000, NULL);
CDialog::OnLButtonDown(nFlags, point);
}
3、WM_RBUTTONDOWN消息的处理
//当按下鼠标右键是取消定时器
voidCDemoDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
KillTimer(1);
CDialog::OnRButtonDown(nFlags, point);
}
4、WM_Timer消息的处理
//当按下鼠标右键是取消定时器
voidCDemoDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
KillTimer(1);
CDialog::OnRButtonDown(nFlags, point);
}
//定时器消息处理函数
voidCDemoDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//判断m_nStyle的值,实现用不同颜色的画刷填充图形
if (m_nStyle< 2)
{
m_nStyle++;
}
else
{
m_nStyle = 0;
}
//刷新图形
InvalidateRect(NULL);
CDialog::OnTimer(nIDEvent);
}
5、实验结果
五、实验总结
(1) 总结定时器消息编程的步骤,以及程序设计过程中需要注意的问题
定时器消息WM_TIMER消息:
消息号:WM_TIMER
字参数:wParam ==》定时器标识
长字参数:(TIMERPROC *) lParam==》定时器回调函数地址
CWnd::SetTimer()功能:设置定时器
UINT SetTimer(
UINT nIDEvent, // 定时器标识符
UINT nElapse,
void (CALLBACK EXPORT* lpfnTimer)
(HWND, UINT, UINT, DWORD)
);
CWnd ::KillTimer()功能:销毁定时器
BOOL KillTimer(
intnIDEvent // 定时器标识符
);
消息映射:
1、消息映射宏
ON_MESSAGE(WM_TIMER,OnTimer)
2、消息处理函数声明
LRESULT OnTimer(WPARAM wParam,
LPARAM lParam) ;
3、消息处理函数实现
LRESULT CDrawWnd::OnTimer(
WPARAM wParam, LPARAM lParam)
{
return 0;
}
(2) 总结实验的心得体会,实验中遇到的困难以及解决的方法等
通过本次实验编程,我学习掌握了从类向导中直接添加消息映射的步骤和方法,了解到通过类向导可以直接在项目中直接添加消息映射,添加处理函数,添加命令,添加成员变量等,使用类向导为我们的编程带来了许许多多的方便,省去了手动添加消息映射,添加成员函数的麻烦。通过本次实验,我重点学习和掌握了MFC 定时器编程,学习到定时器的消息号,及其字参数和长字参数所代表的含义,掌握了设置定时器SetTimer()和销毁定时器KillTimer()的两个定时器有关的函数,掌握两个函数的使用方法。通过此次的编程实验也让我巩固了以前学过的知识,使我能够更加清楚消息处理的过程及消息的处理,是我对MFC应用程序编程有了更加深刻的认识。
继续阅读