您的当前位置:首页正文

中国石油大学visualc++实验3报告

2022-09-19 来源:钮旅网
Visual C++实验报告

Visual C++实验报告

院系:信息与控制工程学院

班级: 姓名: 学号:

实验日期:2014年10月29日

Visual C++实验报告

实验三 MFC 消息映射编程实验

一、预备知识

1、消息映射 消息映射本质上就是一个数组,MFC 使用消息映射建立消息和类的成员函数 的对应关系。消息映射数组中存储的信息 (1) 所处理的消息; (2) 消息应用的控件 ID,或者 ID 范围; (3) 消息所传递的参数; (4) 消息所期望的返回值。

2、消息映射宏 下面介绍常用的两个消息映射宏: (1) ON_MESSAGE:处理任意消息 语法规则: ON_MESSAGE(ID,func) LRESULT func(WPARAM wParam, LPARAM lParam); 举例:映射鼠标左键按下消息 ON_MESSAGE(WM_LBUTTONDOWN, OnLButtonDown) LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam); (2) ON_COMMAND:处理 WM_COMMAND 消息 语法规则: ON_COMMAND(ID,func) void func( ); 举例:映射菜单项命令消息 ON_COMMAND(ID_OPER_TEST, OnOperTest) void OnOperTest ( ); 3、消息映射步骤 MFC 中手工添加消息映射按照如下步骤进行: (1) 在 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 之间添加消息映射 宏; BEGIN_MESSAGE_MAP(CDemoView, CView) ON_MESSAGE(WM_KEYDOWN, OnKeyDown) ON_COMMAND(ID_OPER_TEST, OnOperTest) END_MESSAGE_MAP( ) (2) 在类声明中声明成员函数; (3) 在类的实现部分实现成员函数。

二、实验目的

(1) 熟悉 Visual Studio 开发环境; (2) 掌握消息映射机制的基本原理和手工添加消息映射的方法; (3) 熟练掌握在 Visual Studio 开发环境调试程序的方法。

三、实验内容

设计 MFC 应用程序,手工添加消息映射,实现下面的功能: (1) 按下 CTRL 键,拖动鼠标绘制矩形; (2) 按下 SHIFT 键,拖动鼠标绘制椭圆。

四、实验报告

(1) 总结手工添加消息映射的基本步骤; (2) 列出鼠标绘图功能的实现代码;

(3) 总结实验的心得体会,实验中遇到的困难以及解决的方法等。

五、附录:MFC 消息映射示例代码

先创建一个空白的 Win32 Application 工程,项目属性中设置在静态链接库或者 DLL 中使用 MFC,再创建文件 Demo.h 和 Demo.cpp,输入下面的代码就可以创建一 个 MFC 应用程序框架。 头文件 Demo.h 代码

#include class CDemoWnd: public CDemoWnd { protected: LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam); LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam); LRESULT OnLButtonUp(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP() }; class CDemoApp: public CWinApp { public: BOOL InitInstance(); }; CDemoApp ThisApp; // 全局应用程序对象

Visual C++实验报告

源文件 Demo.cpp 代码 #include \"Demo.h\" BEGIN_MESSAGE_MAP(CDemoWnd, CFrameWnd) ON_MESSAGE(WM_LBUTTONDOWN,OnLButtonDown) ON_MESSAGE(WM_MOUSEMOVE,OnMouseMove) ON_MESSAGE(WM_LBUTTONUP,OnLButtonUp) 10

END_MESSAGE_MAP() LRESULT CDemoWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam) { return TRUE; }

LRESULT CDemoWnd::OnMouseMove(WPARAM wParam, LPARAM lParam) { return TRUE; }

LRESULT CDemoWnd::OnLButtonUp(WPARAM wParam, LPARAM lParam) { return TRUE; }

BOOL CDemoApp::InitInstance() { CDemoWnd *pFrame = new CDemoWnd(); pFrame->Create(0,_T(\"消息映射实验程序\")); pFrame ->ShowWindow(m_nCmdShow); this->m_pMainWnd = pFrame; return TRUE; }

实验结果

(1) 总结手工添加消息映射的基本步骤

(1) 在 BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加消息映射宏; BEGIN_MESSAGE_MAP(CDemoView, CView)

ON_MESSAGE(WM_LBUTTONDOWN, OnLButtonDown) ON_COMMAND(ID_OPER_TEST, OnOperTest) END_MESSAGE_MAP( )

(2)在类声明中声明成员函数; (3) 在类的实现部分实现成员函数。

(2)程序代码

#include \"afxwin.h\"

class CDemoWnd:public CFrameWnd {

public:

CDemoWnd(); ~CDemoWnd();

public:

LRESULT OnPaint(WPARAM wParam,LPARAM lParam);

LRESULT OnLButtonDown(WPARAM wParam,LPARAM lParam); LRESULT OnMouseMove(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP()

Visual C++实验报告

public:

int m_nX0; int m_nY0; int m_nX1; int m_nY1; };

class CDemoApp:public CWinApp {

public:

BOOL InitInstance(); };

CDemoApp theApp;

#include \"Demo.h\"

// 构造函数

CDemoWnd::CDemoWnd() { m_nX0 = 0; m_nY0 = 0; m_nX1 = 0; m_nY1 = 0; }

// 析构函数

CDemoWnd::~CDemoWnd() { }

BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd) ON_MESSAGE(WM_PAINT,OnPaint) ON_MESSAGE(WM_LBUTTONDOWN,OnLButtonDown) ON_MESSAGE(WM_MOUSEMOVE,OnMouseMove) END_MESSAGE_MAP()

LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam) { return 0;

Visual C++实验报告

}

LRESULT CDemoWnd::OnLButtonDown(WPARAM wParam,LPARAM lParam) { m_nX0 = LOWORD(lParam); m_nY0 = HIWORD(lParam); return 0; }

LRESULT CDemoWnd::OnMouseMove(WPARAM wParam,LPARAM lParam) { CClientDC dc(this); // 1 擦除原有图形 dc.SelectStockObject(WHITE_PEN); if(wParam & MK_CONTROL && wParam & MK_LBUTTON) { dc.Rectangle(m_nX0,m_nY0,m_nX1,m_nY1); } if(wParam & MK_SHIFT && wParam & MK_LBUTTON) { dc.Ellipse(m_nX0,m_nY0,m_nX1,m_nY1); } // 2 绘制新的图形 m_nX1 = LOWORD(lParam); m_nY1 = HIWORD(lParam); dc.SelectStockObject(BLACK_PEN); if(wParam & MK_CONTROL && wParam & MK_LBUTTON) { dc.Rectangle(m_nX0,m_nY0,m_nX1,m_nY1); } if(wParam & MK_SHIFT && wParam & MK_LBUTTON) { dc.Ellipse(m_nX0,m_nY0,m_nX1,m_nY1); }

Visual C++实验报告

return 0; }

BOOL CDemoApp::InitInstance() { CDemoWnd *pMainWnd = new CDemoWnd(); pMainWnd->Create(NULL,\"消息映射实验程序”); pMainWnd->ShowWindow(m_nCmdShow); pMainWnd->UpdateWindow(); m_pMainWnd = pMainWnd; return TRUE; }

执行结果

Visual C++实验报告

实验心得

本次实验,我了解了消息映射机制的基本原理和手工添加消息映射的方法,并通过设计程序,掌握了在 Visual Studio 开发环境调试程序的方法,同时进一步熟悉了Visual Studio 开发环境,实验中由于程序代码在预习时已经写出,并没有花过多时间编写代码,但程序中由于理解问题和熟练性总有或大或小的问题,如修改项目属性中“MFC的使用”和“字符集”就容易被忽略。总体而言实验较为顺利,凸显了预习的重要性,提高了实验效率,今后应继续注重预习。

因篇幅问题不能全部显示,请点此查看更多更全内容