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 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的使用”和“字符集”就容易被忽略。总体而言实验较为顺利,凸显了预习的重要性,提高了实验效率,今后应继续注重预习。 因篇幅问题不能全部显示,请点此查看更多更全内容