实验三MFC 消息映射编程实验
一、实验目的
(1) 熟悉Visual Studio 开发环境;
(2) 掌握消息映射机制的基本原理和手工添加消息映射的方法;
(3) 熟练掌握在Visual Studio 开发环境调试程序的方法。
二、实验内容
设计MFC 应用程序,手工添加消息映射,实现下面的功能:
(1) 按下CTRL 键,拖动鼠标绘制矩形;
(2) 按下SHIFT 键,拖动鼠标绘制椭圆。
三、实验结果
(1)总结手工添加消息映射的基本步骤;
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、在类的实现部分实现成员函数。列出鼠标绘图功能的实现代码;
(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()
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;
}
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);
}
return 0;
}
BOOL CDemoApp::InitInstance()
{
CDemoWnd *pMainWnd = new CDemoWnd();
pMainWnd->Create(NULL,_T("消息映射实验程序"));
pMainWnd->ShowWindow(m_nCmdShow);
pMainWnd->UpdateWindow();
m_pMainWnd = pMainWnd;
return TRUE;
}
(3)总结实验的心得体会,实验中遇到的困难以及解决的方法等。
这次实验主要练习了MFC的消息映射的编程,包括消息映射宏和在MFC中手工添加消息映射的步骤,更加深刻地学习了消息映射的概念和作用。
实验指导书中的MFC框架代码中存在一个错误class CDemoWnd: public CDemoWnd,需要将第二个CDemoWnd改为CFramewnd。