实验九基于文档视图结构的MFC简单应用程序框架设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验九基于文档视图结构的MFC简单应用程序框架设计实验九基于文档/视图结构的MFC简单应用程序框架设计(4学时) ,实验目的,
1. 基本掌握Windows环境下MFC程序的开发流程和方法;
2. 基本掌握MFC中的文档/视图框架体系的简单编程方法;
,实验内容与步骤,
创建一个单文档的MFC工程,在其中实现简单的“涂鸦”操作。界面如图9-1
所示,实现如下功能:
图9-1、程序运行界面图
(1) 用户在视图窗口中按下鼠标左键,并拖动鼠标时,在窗口中即可进行“涂鸦”操
作,用户释放鼠标键时,绘图结束。
(2) 在文档类中设计一个数组,以保存视图窗口所绘制的线条坐标。使当窗口
重绘时,
能够重现已绘图形。
,MFC编程要点,
1. 视图类对象代表了应用程序的窗口客户区,是文档等信息的一个显示窗口,亦为用
户与程序间进行数据交互的桥梁。
2. 本实验中,一旦鼠标在窗口客户区内有所动作,则MFC将有关消息传递给视图类
对象进行处理。
,VC编程实现,
1、使用AppWizard创建一个单文档的MFC工程test9(在对话框“MFC AppWizard-Step
1”中选中“Single document”,各项设置均取默认值);
1
2、在视图类的头文件test9View.h中声明有关的成员变量:
protected:
bool m_bDraw; //绘图标识
HCURSOR m_Hcursor; //光标对象
CPoint m_pOld; //记录鼠标位置
在视图类CTest9View的构造函数中对上述成员变量进行初始化:
CTest9View::CTest9View()
{
// TODO: add construction code here
m_bDraw=FALSE;
//载入“十字”光标
m_Hcursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS);
}
注:红色内容为VC自动生成的代码(下同)。
3、点击菜单项View->ClassWizard,使用ClassWizard为视图类CTest9View 添加消息WM_LBUTTONDOWN,定义消息响应函数,实现按下鼠标左键的相关绘图操作。ClassWizard操作如图9-2所示。有关代码为:
图9-2、使用ClassWizard为CTest9View添加消息WM_LBUTTONDOWN void CTest9View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default SetCursor(m_Hcursor); //使用新光标
m_bDraw=TRUE; //进入绘图状态
m_pOld=point;
SetCapture(); //捕捉鼠标
CRect rect;
GetClientRect(&rect); //获取客户窗口矩形区域
ClientToScreen(&rect); //转换为屏幕坐标
ClipCursor(rect); //限定鼠标不能移出客户窗口
CView::OnLButtonDown(nFlags, point);
2
}
同理,使用ClassWizard为视图类CTest9View添加消息WM_LMOUSEMOVE和LBUTTONUP,并定义消息响应函数,实现移动鼠标和释放鼠标左键的相关绘图操作。有关代码为:
void CTest9View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default if(m_bDraw)
{
CClientDC dc(this); //获取客户窗口DC
dc.MoveTo(m_pOld); //绘图
dc.LineTo(point);
m_pOld=point;
}
CView::OnMouseMove(nFlags, point); }
void CTest9View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default m_bDraw=FALSE; //取消绘图状态
ReleaseCapture(); //释放鼠标捕捉
ClipCursor(NULL); //取消鼠标区域的限制
CView::OnLButtonUp(nFlags, point); }
,思考题,
1. 设法将图形信息保存在文档对象中,使当窗口大小改变或覆盖时,可据此进行重绘。
2. 设法通过文档的序列化操作,将图形信息保存在指定文件中。当打开该文件时,显示相
关图形。
3