1、接前文《MFC绘图板(二)》
2、本以为用MFC实现一个绘图程序很简单,但是实际做起来却遇到了许多问题,下面对开发过程中的一些问题记录如下:
3、首先,介绍以下MFC绘图板实现的功能:
(1)MFC绘图板以Win7自带的画图程序为参考,基本样式相似;
(2)具有绘制曲线、直线、矩形、圆形基本图形的功能;
(3)能够对绘图线条的颜色、粗细、类型(实现、虚线、点画线等等)进行设置;
(4)实现类似“油漆桶”功能,即对某个色块进行填充;
(5)实现绘图操作的撤销动作;
(6)实现画图纸张大小的动态调整;
=====================================================================
注:上述6条已基本实现
=====================================================================
(7)文字输入功能;
(8)部分选取功能;
(9)放大镜功能;
(10)橡皮擦功能;
(11)取色器功能;
(12)数据保存功能:目前计划数据保存成三种格式:bmp、pdf以及xml;
(13)待定... ...
4、接着,介绍一下MFC绘图版的实现思路:
(1)以单文档工程为基础,将视图切分为上下两个部分,上部分用于放置各种选着面板,例如颜色面板、线条面板、绘图工具面板等;下部分用于绘图;
(2)第一版程序绘图使用纯GDI实现,主要响应鼠标左键的三个消息绘图:一次绘图操作以鼠标左键按下开始,至鼠标左键释放结束,期间响应鼠标移动,绘出相应的轨迹。
(3)前文提及的绘制曲线是指:根据鼠标移动的轨迹,绘出相应的线条;具体实现时采用绘制多条顺序相连的极短直线来实现此功能,将这些首尾相连的点的坐标保存下来,使用STL;
(4)绘制直线、矩形和圆形可以归为一类,只要给定两个点的坐标,就能绘制直线、矩形或是椭圆,将这两个点保存下来:
(5)创建一个绘图类,将绘图操作封装,进行一次绘图操作就new一个绘图类的对象,并把该对象的指针存入list中,进而达到保存绘图数据的目的;另注:绘图类的构造函数可以针对不同的绘图形式创建相应的实现;
(6)关于撤销功能,即消除一次绘图操作,因为上一条中已经将绘图数据保存下来了,所以该条在实现上应该是很简单的;但是,在实际编程中发现,如果每次重绘都将图形逐个绘制一遍效率太低,特别是在包含大面积的填充操作时,尤其显得速度慢;所以考虑,每次绘图前将当前的图像整个保存,作为下一次绘图的背景,这样效率提升显著。
(7)另外,如果有大量的绘图操作,都应在内存DC中绘制,然后整个拷贝;
(8)关于“油漆桶”功能的实现,使用注入填充算法或边缘填充算法,
详见:http://blog.csdn.net/wwkaven/article/details/40710721
http://blog.csdn.net/wwkaven/article/details/40713929
(9)以上填充算法在MFC中的纯GDI环境下,实现的速度较低,即使现在内存DC中调用填充函数,填充大面积区域依然较慢,哪位有好的办法可以留言,先多谢了;
(10)... ...
5、最后,放一张目前程序的截图:
6、待续... ...