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 \
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);