中国石油大学(华东)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++ 实验这门课产生了浓厚的兴趣,我相信我以后一定会学好这门课。