DrawTools绘图程序代码分析

来源:互联网 发布:oracle 清除表数据 编辑:程序博客网 时间:2024/06/18 08:14
在网上下载了一些使用GDI+绘图的原码来学习,一开始先找了个代码少的、逻辑比较简单的项目——DrawTools。该项目用于展示如何使用C#的GDI+来绘制简单的图形。代码从https://github.com/tolbkni/DrawTools中下载的,我看的是其中的Winform版本的实现代码,该程序代码量有两千行左右,主要实现的功能有:
  • 绘制线条
  • 绘制矩形
  • 绘制椭圆
  • 绘制自由曲线
  • 各种绘图对象的移动操作
  • 各种绘图对象的缩放操作
  • 绘图对象的序列化和反序列化
  • 本地文件的拖拽打开操作
DrawTools解决方案中总共有两个项目,如下图所示,其中DocToolKit是个类库,为DrawTools项目提供必须的类型。

DocToolKit
DocToolKit类库中包含下列类型。

  其中最重要的类型:
DocManager:该类主要负责与文档相关的操作,例如打开文档、关闭文档、保存文档,并记录与文档相关的设置,例如文档默认名称,文档初始路径等;
DragDropManager:处理用户将文件拖拽到主窗口中打开的情况;
MruManager:用于记录和处理用户最近打开的文件列表;
PersistWindowState:保存上一次关闭程序时的主窗口位置和大小, 并在本次程序启动时从注册表中读出然后初始化本次程序窗口的位置和大小。
DrawTools
DrawTools项目中的功能主要分为三大类,如下图所示:
DrawObject中主要包含在界面中绘图的类,如下图所示,DrawObject为抽象基类,它定义了在窗口中绘制不同对象的一些通用的接口,然后四个子类分别保存绘制线条、矩形、椭圆和自由曲线对象需要的信息:

  Tool中是关于不同类型绘图对象对窗口事件的响应函数类,这些类主要是处理新建绘图对象时的鼠标事件,包括鼠标按下、鼠标移动和鼠标松开三个事件:

  UndoRedoManage中的类型用于处理Undo/Redo事件,本项目中处理undo/redo采用的是Command模式,主要的命令是新建绘图对象、删除选中绘图对象、删除全部绘图对象和修改选中绘图对象属性。

 
程序运行的主程序是MainForm这个窗口,在这个窗口的启动过程中,将DocToolKit类库中的各类管理类与主窗口绑定,并创建绘图板DrawArea对象。

DrawTools程序主要用户展示如何使用GDI+绘图,里面都是一些简单的操作,通过阅读程序,认为还可以增加的功能如下:
1)窗口尺寸变化时,图形的尺寸随之改变;
2)绘制直线时,按着Shift键可以画水平、竖直、斜45度的直线;
3)绘制矩形时,按着Shift键可以画正方形;
4)绘制椭圆时,按着Shift键可以画圆形;
我阅读的代码可以在下面的链接中下载,里面还有一些我增加的注释:
http://pan.baidu.com/s/1jImmkg2