您的当前位置:首页正文

实验十 文档与视图

2021-07-03 来源:客趣旅游网
实验十 文档与视图

一、实验目的

1、了解文档与视图结构的实现 2、掌握文档序列化的实现。 2、了解一档多视的实现。

二、实验内容与步骤

编写程序,在打开的单文档窗口中可实现画线的功能。通过创建一个能建立画布并能实现画线的简单功能的应用程序,进一步了解视图的工作原理 【实验步骤】

1、建立Application

利用AppWizard创建一个单文档应用程序Exam5_1。 2、在视图类中添加数据成员

(1)在项目工作区的打开FileView选项卡,展开Header files树,双击Cexam5_1View.h,在其中加入数据成员的定义:

protected: int m_Tag; //用来记录鼠标是否被按下状态。 HCURSOR m_HCursor; //用来保存光标指针。 CPoint m_End; //提供其它鼠标信息处理器获得前一鼠标信息的鼠标位置 CPoint m_Begin; //存放左键按下的位置 (2)在CExam7View.cpp中对变量进行初始化。

Cexam5_1View::CExam7View() {

m_Tag=0; //初始化鼠标状态变量,表示鼠标没有按下。 m_HCursor=AfxGetApp()->LoadCursor(IDC_cousor); //用来装载刚才建立的光标,并将光标的句柄保存在变量s_Cross中。 }

3、添加鼠标消息映射

执行菜单:查看→建立类向导,在类向导窗口的消息处理标签中加入以下三条消息 WM_LBUTTONDOWN WM_LBUTTONUP WM_MOUSEMOVE

系统自动加入消息处理函数 OnLButtonDown() OnLButtonUp() OnMouseMove()

4、在消息处理函数中加入如下代码:

(1)在鼠标按下的消息处理中加入:

void Cexam5_1View::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default m_End=point; //存在鼠标的当前位置 m_Begin=point; //存放画线的起始位置 SetCapture();

//执行这条语句后,当鼠标移动到本窗口以外时,鼠标消息仍然被发送给本窗口 m_Draw=1; //表示正在拖动鼠标 RECT rect; GetClientRect(&rect); //获得视图窗口区的坐标 ClientToScreen(&rect); //将窗口坐标转换为屏幕坐标 ClipCursor(&rect); //将鼠标限定在视图窗口区内

CView::OnLButtonDown(nFlags, point);

}

(2)在鼠标移动的消息处理中加入:

void Cexam5_1View::OnMouseMove(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default SetCursor(m_HCursor); //自定义鼠标形状为十字形

if (m_Draw) //判断是否在画线,如果不是就退出 {

CClientDC dc(this); //创建一个客户区的设备环境句柄 dc.SetROP2(R2_NOT); //设置绘画方式

dc.MoveTo(m_Begin); //将当前点移到指定点,表示画线从这一点开始 dc.LineTo(m_End); //用反色绘制直线,实际上是擦除上次所绘直线 dc.MoveTo(m_Begin);

dc.LineTo(point); //这两条语句是绘制一条从起点到当前鼠标点的直线

m_End=point;}

//保存鼠标当前位置,以便鼠标移动后擦除该线

//(即鼠标移动的位置不画线,只有鼠标抬起才决定画线。) CView::OnMouseMove(nFlags, point); }

(3)在鼠标抬起的消息处理中加入:

void Cexam5_1View::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_Draw) { m_Draw=0; //表示已经释放鼠标 ReleaseCapture(); ClipCursor(NULL); //允许鼠标移动到屏幕任意位置 }

CView::OnLButtonUp(nFlags, point); }

(4)修改窗口特性,以便所画的线清晰

BOOL Cexam5_1View::PreCreateWindow(CREATESTRUCT& cs) { cs.lpszClass=AfxRegisterWndClass

(CS_HREDRAW|CS_VREDRAW, //改变窗口大小时重画窗口 0, // 不用鼠标

(HBRUSH)::GetStockObject(WHITE_BRUSH), //设置白色背景 0 );

return CView::PreCreateWindow(cs);

}

因篇幅问题不能全部显示,请点此查看更多更全内容