中国石油大学(华东)VC 实验报告MFC_定时器编程实验
- 格式:docx
- 大小:175.91 KB
- 文档页数:5
MFC 定时器编程实验
一、实验目的
(1) 掌握Visual Studio 开发环境调试程序的方法;
(2) 掌握MFC 消息映射的操作步骤;
(3) 掌握MFC 编程模式中定时器的使用方法.
二、实验内容
设计一个窗口,在窗口中间位置绘制一个红色粗实线的矩形,并用交替使用三种不同样式的画刷填充矩形的内部,每次刷新的时间间隔为1.0 秒。
单击鼠标左键启动定时器,单击鼠标右键停止定时器。
三、程序清单
1.头文件
#include "afxwin.h"
class CDemoWnd:public CFrameWnd
{
public:
CDemoWnd();
~CDemoWnd();
public:
LRESULT OnPaint(WPARAM wParam,LPARAM lParam);
LRESULT OnTimer(WPARAM wParam,LPARAM lParam);
LRESULT OnLButtonDown(WPARAM wParam,LPARAM lParam);
LRESULT OnRButtonDown(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
int m_nState; };
class CDemoApp:public CWinApp
{
public:
BOOL InitInstance();
};
CDemoApp theApp;
2.源文件
#include "Demo.h"
CDemoWnd::CDemoWnd() // 构造函数
{
m_nState = 0;
}
CDemoWnd::~CDemoWnd() // 析构函数
{
}
BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)
ON_MESSAGE(WM_PAINT,OnPaint)
ON_MESSAGE(WM_TIMER,OnTimer) ON_MESSAGE(WM_LBUTTONDOWN,OnLButtonDown)
ON_MESSAGE(WM_RBUTTONDOWN,OnRButtonDown)
END_MESSAGE_MAP()
LRESULT CDemoWnd::OnLButtonDown(WPARAM wParam,LPARAM lParam)
{
SetTimer(1,1000,NULL);
return 0;
}
LRESULT CDemoWnd::OnRButtonDown(WPARAM wParam,LPARAM lParam)
{
KillTimer(1);
return 0;
}
LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam)
{
CPaintDC dc(this);
CPen Pen, *poldpen;
CBrush Brush, *pOldBrush;
switch (m_nState)
{
case 0:
Brush.CreateSolidBrush(RGB(0, 150, 255)); //紫色
m_nState = 1;
break;
case 1:
Brush.CreateSolidBrush(RGB(0, 255, 100)); //蓝色
m_nState = 2;
break;
case 2:
Brush.CreateSolidBrush(RGB(200, 0, 200)); //青色
m_nState = 0;
break;
}
pOldBrush = dc.SelectObject(&Brush);
Pen.CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
poldpen = dc.SelectObject(&Pen);
dc.Rectangle(300, 100, 800, 500);
dc.SelectObject(poldpen);
dc.SelectObject(pOldBrush);
return 0;
}
LRESULT CDemoWnd::OnTimer(WPARAM wParam,LPARAM lParam)
{
CRect rt(40, 40, 1000, 1000); InvalidateRect(&rt);
return 0;
}
BOOL CDemoApp::InitInstance()
{
CDemoWnd *pMainWnd = new CDemoWnd();
pMainWnd->Create(NULL,"Demo Mini-MFC");
pMainWnd->ShowWindow(m_nCmdShow);
pMainWnd->UpdateWindow();
m_pMainWnd = pMainWnd;
return TRUE;
}
四、运行结果
五、定时器消息编程的步骤,以及程序设计过程中需要注意的问题;
1、 启动定时器
使用SetTimer 函数创建一个定时器,并制定超时时间,然后启动定时器。该
函数说明如下:
UINT SetTimer(
UINT nIDEvent, // 定时器标识符
UINT nElapse, // 定时时间,单位是毫秒
void (CALLBACK EXPORT* lpfnTimer) // 定时器回调函数地址
(HWND, UINT, UINT, DWORD)
);
示例代码:
SetTimer(1,200,NULL);
2、 销毁定时器
定时器在不使用时要使用KillTimer 函数进行销毁,该函数说明如下:
BOOL KillTimer(
int nIDEvent // 定时器标识符
);
示例代码:
KillTimer(1);
应注意:WM_TIMER消息的应用
消息号:WM_TIMER
wTimerID = wParam; // 定时器标识符
tmprc = (TIMERPROC *) lParam; // 定时器回调函数的地址
其中,定时器回调函数在使用SetTimer 启动定时器时指定,如果没有指定定时器回调函数则可直接通过消息映射处理WM_TIMER 消息。
六、实验总结
通过本次实验,我进一步的熟悉了Visual Studio 软件的开发环境,对这个软件有了更深的了解。熟悉了 Visual Studio开发环境, 学习和掌握了 MFC消息映射的操作步骤,并且掌握MFC 编程模式中定时器的使用方法.,进一步掌握了在Visual Studio中调试程序的方法。
在实验中我也复习了以前的实验中学到的在Visual Studio 开发环境调试程序的方法,并且可以更加熟练的应用其来修改程序。我也理解了定时器消息编程的步骤。
在实验过程中,我也遇到了一些困难,比如不够熟悉Visual Studio软件的应用,忘记在后面销毁定时器,忘记改变项目中Demo的属性。经过老师和同学的指导,我学会了解决这些问题的办法。在实验课里收获了很多,感觉受益匪浅。
通过这次的实验,我对Windows程序编程有了较为全面的了解,熟练的掌握了C++程序调试的方法。感觉这门实验课和理论课的知识有很大的联系,使我对Visual Studio 软件和Visual C++ 实验这门课产生了浓厚的兴趣,我相信我以后一定会学好这门课。