第7节 图层软件架构
开发一个可以支持画线、矩形和椭圆形等图形的软件,必须将鼠标按下、释放和拖动等事件联合处理。如果将各种图形绘制以及拖放过程在一个类中编写,则最后这个类的代码将无比庞大而且难以维护。大型图形软件通用的架构,是用一个抽象类将不同图层代码分类管理。
创建一个工程名为“Ly”的SDI程序,演示使用图层软件架构开发绘图软件,如图8-21所示。

图8-21 创建单文档工程
1)在MFC应用程序向导的每个步骤中都单击“Next”按钮,只有在第5个分页中选择“As a statically linked library”,最后单击“Finish”按钮完成工程创建,如图8-22所示。

图8-22 完成工程创建
2)在资源视图中修改ToolBar资源,添加一些工具栏按钮,如图8-23所示。

图8-23 编辑主工具栏资源
3)新增工具栏按钮的属性见表8-1。
表8-1 工具栏按钮的属性

4)在视图类CLyView的头文件中添加一个成员变量。

5)在构造函数中初始化。

6)在视图类中为4个工具栏按钮建立命令和更新消息映射函数(共8个函数),如图8-24所示。

图8-24 添加工具栏按钮的消息映射函数
7)修改以上建立的8个工具栏按钮的消息映射函数代码。


8)编译并运行,测试代码,如图8-25所示。

图8-25 查看运行结果
单击新添加的4个工具栏按钮,对应按钮成为选择状态。
9)在类视图中的根节点上单击鼠标右键,在弹出的快捷菜单中,选择“New Class”命令创建一个类,如图8-26所示。
10)类型选择普通类“Generic Class”,输入类名“CLayer”后单击“OK”按钮,如图8-27所示。

图8-26 添加新类

图8-27 创建普通类
11)在创建好的类头文件“Layer.h”中,添加一些成员变量和纯虚函数。(https://www.daowen.com)

12)创建一个CLayer类的派生类CLine,用于线段绘制过程的管理,如图8-28所示。

图8-28 添加派生类
13)修改派生类的头文件“Line.h”,添加一些变量并重写基类的纯虚函数。

14)修改派生类的源代码文件“Line.cpp”。



15)用同样的方法再创建一个CLayer类的派生类CEllip,并修改头文件Ellip.h。

16)修改派生类的源文件Ellip.cpp。



17)修改CLayer类的源文件Layer.cpp。

18)在视图类CLyView中再添加一些成员变量。

19)修改CLyView类中OnDraw函数的代码。

20)添加CLyView类的WM_LBUTTONDOWN消息映射函数。

21)添加CLyView类的WM_LBUTTONUP消息映射函数。


22)添加CLyView类的WM_MOUSEMOVE消息映射函数。

23)编译并运行,测试代码,如图8-29所示。
单击“线段”或“椭圆”工具栏按钮,再单击屏幕拖动鼠标进行图形绘制。单击“拖动”工具栏按钮,选中一个绘制好的图层进行拖动。

图8-29 查看运行结果