GDI+ 动态绘制直线

绘制直线的语句其实非常简单:
newgraphics.DrawLine(new Pen(Color.Black), startPoint, new PointF(e.X, e.Y));

但是直接使用DrawLine函数,绘制的直线不能看到绘制过程,所以应该进行优化。

1. 我们在程序中使用一个pictureBox控件
GDI+ 动态绘制直线_第1张图片
2. 我们在主类中定义需要全局使用的变量和对象
GDI+ 动态绘制直线_第2张图片
3. 在载入程序函数中初始化对象和变量
GDI+ 动态绘制直线_第3张图片
4. 按下鼠标,开始绘图操作

5. 在鼠标移动过程中,进行绘图
GDI+ 动态绘制直线_第4张图片
5. 鼠标抬起,本次绘图结束
GDI+ 动态绘制直线_第5张图片
难点分析:

之所以在绘制直线的过程中,可以看到绘制的过程,而不会保存过程的痕迹是因为,我们在pictureBox上不断贴“含有最新绘制的直线”的图片,新的一直在覆盖原来的,所以绘图结束看到的就是最后的一副bmp。
我们深入的进行分析:
在鼠标移动事件中,首先执行了 ,这一步操作定义了一个img图片,这个img图片是originalImg的一个副本。
注意我们在移动鼠标的过程中,MouseMove函数不断在执行。
每次执行MouseMove函数时,都是首先做了一个originalImg的副本bmp,然后画直线,然后绘制在pictureBox上,而且是绘制在pictureBox的同一位置上。因为bmp的尺寸都是一样的,所以会不断复制原来的图片。
那么这个originalImg对象是怎么来的呢?
绘图的一开始,也就是第一次绘制图形时,originalImg是pictureBox对应的原始图片,也就是一个空白的画布。
然后,我们注意到MouseUp函数中有 ,这一操作使得originalImg取图像finishingImg,finishingImg记录了上次绘图的结果。

所以,在MouseMove函数中的任务可以划分为三部分:
1. 读取上次操作完成的图片
2. 在图片上绘制直线,得到新的图片
3. 把finishingImg替换为新的图片
4. 把显得图片显示到画图板,覆盖上一张

你可能感兴趣的:(GDI+ 动态绘制直线)