实验十一 MFC的简单消息映射与处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十一 MFC的简单消息映射与处理(4学时)
[实验目的]
1、基本掌握Windows环境下MFC程序的开发流程和方法;
2、基本掌握MFC中的消息映射与处理方法;
[实验内容]
创建一个单文档的MFC工程,使用ClassWizard在视图类中添加WM_KEYDOWN、WM_KEYUP、WM_CHAR键盘消息映射和消息响应函数,添加WM_LBUTTON、WM_ RBUTTON鼠标消息映射和消息响应函数及。
界面如图所示,实现如下功能:
程序运行界面图
(1)用户按下/释放Shift键时,程序在视图窗口中显示有关的提示信息。
(2)用户按下Shift+B键时,程序在视图窗口中显示有关的提示信息。
(3)用户在视图窗口中按下鼠标左键,并拖动鼠标时,在窗口中绘制一个随鼠标位置变
化的椭圆。
当用户释放鼠标键时,停止椭圆的绘制。
[实验步骤]
(1)创建一个单文档的MFC工程;
(2)使用ClassWizard在其视图类中添加键盘消息WM_KEYDOWN、WM_KEYUP和
WM_CHAR(分别对应键的按下、松开和按键动作)和消息响应函数;
(3)在视图类的头文件中添加成员变量,以记录按键状态:
protected:
BOOL bShiftdown, bShiftup, bShiftB;
并在视图类的构造函数中,对上述成员变量进行初始化:
*View::*View()
{
// TODO: add construction code here
bShiftdown=bShiftup=bShiftB=FALSE; //赋初值
}
其中,红色内容对应VC自动生成部分。
*View为视图类名。
(4)在键盘消息响应函数中,判断按键的状态,并设置上述成员变量的值。
代码如下:
void *View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
//判断Shift键是否被按下
if(nChar==VK_SHIFT)
{
//AfxMessageBox("dd");
bShiftdown=TRUE;
bShiftup=FALSE;
Invalidate(TRUE); //显示信息
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void *View::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
//判断Shift键是否被释放
if(nChar==VK_SHIFT)
{
//AfxMessageBox("dd");
bShiftup=TRUE;
//显示信息
Invalidate(TRUE);
bShiftdown=FALSE;
}
CView::OnKeyUp(nChar, nRepCnt, nFlags);
}
void *View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
if((nChar==98)||(nChar==66)) //判断是否敲击了字符键B键或b键{
if(bShiftdown)
{
bShiftB=TRUE;
bShiftdown=FALSE;
//显示信息
Invalidate(TRUE);
}
}
CView::OnChar(nChar, nRepCnt, nFlags);
}
(5)对视图类的OnDraw函数进行重载,根据成员变量的值(实际对应着按键的状态),
显示相关信息。
代码为:
void CBaseKeyDemoView::OnDraw(CDC* pDC)
{
CBaseKeyDemoDoc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
// TODO: add draw code for native data here
if(bShiftdown) //按下了Shift键
{
pDC->TextOut(20,20,"用户按下了Shift键!");
}
if(bShiftup) //释放了Shift键
{
pDC->TextOut(20,20,"用户释放了Shift键!");
}
if(bShiftB) //同时按下了Shift键和B键
{
pDC->TextOut(20,20,"用户同时按下Shift键和B键!");
bShiftB=FALSE;
}
}
(6)同理,在视图类的头文件中添加成员变量,以记录鼠标的状态:
public:
BOOL bDrag; //是否在拉动
ptDown; //鼠标左键按下位置
CPoint
ptUp;
//鼠标左键释放位置
CPoint
并在视图类的构造函数中,对上述成员变量进行初始化:
bDrag=false;
p tDown.x=ptDown.y=0;
p tUp.x=ptUp.y=0;
(7)在视图类中添加绘制椭圆的成员函数DrawCircle,代码如下:
void CBaseMouseDemoView::DrawCircle()
{
Invalidate(false);
CClientDC dc(this); //获取DC
CRect rect;
GetClientRect(rect); //获取客户窗口区域 CBrush brush(RGB(255,255,255));
dc.FillRect(rect,&brush); //填充背景色为白色 dc.Ellipse(ptDown.x,ptDown.y,ptUp.x,ptUp.y); //绘制矩形
}
(8)使用ClassWizard在视图类中添加鼠标消息WM_LBUTTONDOWN、
WM_LBUTTONUP和WM_MOUSEMOVE(分别对应鼠标左键的按下、松开和鼠标移动)和鼠标消息响应函数;
(9)在鼠标消息响应函数中,对鼠标的各种动作给予相应操作:
void *View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
bDrag=TRUE;
ptUp=ptDown=point;//记录鼠标当前位置
CView::OnLButtonDown(nFlags, point);
}
void *View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(bDrag)
{
ptUp=point;
DrawCircle(); //画新圆
bDrag=FALSE;
}
CView::OnLButtonUp(nFlags, point);
}
void CBaseMouseDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(bDrag)
{
ptUp=point;//记录鼠标的当前位置
DrawCircle(); //画新圆
}
point);
CView::OnMouseMove(nFlags,
}。