文档/视图结构开发实例
一、实例说明
二、视图的处理
1在视图类中定义成员变量
在CSDocDemoView.h中添加成员变量:
在CSDocDemoView.cpp中构造函数中初始化成员变量:
全局函数AfxGetApp( ) 回指向应用程序对象的一个指针,通过该指针调用CWinApp类成员函数LoadStandardCursor( )载入系统定义的光标资源。
2 添加鼠标消息映射及消息处理函数
OnLButtonDown( );
OnLButtonUp( );
OnMouseMove( );
例:
2.1 消息处理函数声明
在CSDocDemoView 类的资源文件中,添加鼠标消息处理函数实现代码,如下:
4设置视图窗口的特性 (非必需)
在视图类的PreCreatWindow函数中,可以实现视图窗口的特性。CSDocDemoView类已经自动重载了该函数,在其中添加代码实现视图的光标为箭头光标,窗口背景为浅灰色,代码如下:
5 修改程序窗口标题栏
6 编译运行
按F5编译程序,即可以利用鼠标在客户窗口中进行绘图操作,如下图示。
可见,仅在视图类中就可以实现客户窗口的绘图操作。然而这种绘图是很不稳定的,当窗口大小改变或覆盖(ugl)引起重绘时,所绘图形就会消失。而解决这个问题,可以将图形信息保存在文档对象中,当窗口重绘时,根据这些保存的信息重新绘制。
三、文档的处理
1.
在工程中,添加一个派生自CObject类的新类CLineDraw,用于实现与图形线条有关的操作。头文件“LineDraw.h”的实现如下:
实现文件内容如下:
2 在文档类CSDocDemoDoc中,实现存储线条坐标
在文档类CSDocDemoDoc的头文件中定义数组对象和操作CLineDraw对象的相关函数。如下:
在文档类CSDocDemoDoc的实现文件中定义函数,如下:
由前面介绍,绘制直线的操作是在OnMouseMove()函数中实现的,这里将OnMouseMove( )代码修改如下:
4 重写视图类中的OnDraw( )函数
当视图窗口进重绘时,它会调用视图类中的OnDraw( )函数,因此需要在OnDraw( )函数中,根据文档类中数组对象何保存的数据恢复直线。代码如下:
(注意,此函数在生成时就已有,直接在其内添加即可!)
5 文档数据的删除
当初始化新文档之前,如通过“文件”->“新建”菜单命令项创建一个新的文档,必须删除存放在当前文档中的数据。这就需要在文档类中重载函数DeleteContents(
6 添加“撤消”菜单命令项入处理
在“Resource View”选项中,单击“Menu”资源中的“IDR_MAINFRAME”菜单资源,在其中添加“编辑”主菜单项,在其下添加“撤消”菜单命令项,ID设置为“ID_UNDO”,其余属性项采用默认置。如下所示:
采用ClassWizard,在文档类SDocDemoDoc中,分别为菜单项添加COMMAND 的UPDATE_COMMAND_UI消息处理函数 OnUndo(
由于文档中存放有所绘制的直线,窗口缩放和移动时,视图始终显示所绘制的图形,同时还可以通过“撤消”菜单命令项取消最后一步的绘图操作,运行结果如下图:
由于每移动一下鼠标,就会记录下一小段直线对象,所以需多次撤消,才能明显看出。
更改点,每次鼠标左键松开时,再加一标识对象,当撤消时,一次撤消到此标识对象为止。