当前位置:文档之家› 消息映射编程实验

消息映射编程实验

MFC 消息映射编程实验实验报告姓名:杨培培班级:电气12级3班12053307【预备知识】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) 总结手工添加消息映射的基本步骤;①在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) 列出鼠标绘图功能的实现代码;源文件 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)ON_MESSAGE(WM_TIMER,OnTimer)END_MESSAGE_MAP()LRESULT CDemoWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam){m_X0 = m_X1 = LOWORD(lParam);m_Y0 = m_Y1 = HIWORD(lParam);return 0;}LRESULT CDemoWnd::OnMouseMove(WPARAM wParam, LPARAM lParam){/*CClientDCdc(this);dc.SelectStockObject(WHITE_PEN);if((wParam& MK_LBUTTON) && (wParam& MK_CONTROL)){dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1);}if((wParam& MK_LBUTTON) && (wParam& MK_SHIFT)){dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1);}m_X1 = LOWORD(lParam);m_Y1 = HIWORD(lParam);dc.SelectStockObject(BLACK_PEN);if((wParam& MK_LBUTTON) && (wParam& MK_CONTROL)){dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1);}if((wParam& MK_LBUTTON) && (wParam& MK_SHIFT)){dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1);}return 0; */CClientDC dc(this);CPen hp,*pOldPen,hp1;hp.CreatePen(PS_SOLID,3,RGB(255,0,0));pOldPen=dc.SelectObject(&hp);CPoint point [3];point [0] = CPoint(m_X0,(m_Y0+m_Y1)/2);point [1] = CPoint(m_X0,m_Y0);point [2] = CPoint((m_X0+m_X1)/2, m_Y0);if((wParam & MK_CONTROL) && (wParam & MK_LBUTTON)) //按下ctrl键,拖动鼠标绘制矩形{dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1);}if((wParam & MK_SHIFT) && (wParam & MK_LBUTTON))//按下shift键,拖动鼠标绘制椭圆{dc.Rectangle(m_X0,m_Y0,(m_X0+m_X1)/2,(m_Y0+m_Y1)/2);hp1.CreatePen(PS_SOLID,3,RGB(255,255,255));pOldPen=dc.SelectObject(&hp1);dc.Polyline(point, 3);dc.SelectObject(pOldPen);dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1);}m_X1= LOWORD(lParam);m_Y1 = HIWORD(lParam);return 0;}LRESULT CDemoWnd::OnLButtonUp(WPARAM wParam, LPARAM lParam){/* CClientDCdc(this);dc.SelectStockObject(WHITE_PEN);if((wParam& MK_LBUTTON) && (wParam& MK_CONTROL)){dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1);}if((wParam& MK_LBUTTON) && (wParam& MK_SHIFT)){dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1);}m_X1 = LOWORD(lParam);m_Y1 = HIWORD(lParam);dc.SelectStockObject(BLACK_PEN);if(wParam& MK_CONTROL){dc.Ellipse(m_X0,m_Y0,m_X1,m_Y1);}if(wParam& MK_SHIFT){dc.Rectangle(m_X0,m_Y0,m_X1,m_Y1);}return 0; */m_X0=m_X1= LOWORD(lParam);m_Y0=m_Y1= HIWORD(lParam);return 0;}LRESULT CDemoWnd::OnLButton(WPARAM wParam, LPARAM lParam) {return 0;}BOOL CDemoApp::InitInstance(){CDemoWnd *pFrame = new CDemoWnd();pFrame->Create(0,_T("鼠标绘图程序"));pFrame->ShowWindow(m_nCmdShow);this->m_pMainWnd = pFrame;return TRUE;}头文件 Demo.h 代码#include <afxwin.h>class CDemoWnd: public CFrameWnd{public:int m_X0;int m_Y0;int m_X1;int m_Y1;protected:LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam);LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam);LRESULT OnLButtonUp(WPARAM wParam, LPARAM lParam);LRESULT OnLButton(WPARAM wParam, LPARAM lParam);DECLARE_MESSAGE_MAP()};class CDemoApp: public CWinApp{public:BOOL InitInstance();};CDemoApp ThisApp; // 全局应用程序对象【实验结果】(3) 总结实验的心得体会,实验中遇到的困难以及解决的方法等。

在上课时,老师的上机演示,让我对MFC消息映射有了初步的了解,也让我对编程产生了兴趣。

本次实验考查了MFC消息映射编程,我熟悉了Visual Studio的开发环境,同时也掌握了消息映射机制的基本原理和手工添加消息映射的方法。

在实验过程中也遇到了一些困难,通过询问同学,和查阅资料,让我对MFC编程也有了进一步的认知,同时也使我完成了本次实验。

相关主题