在整个7月,要自己搞个东东出来,名字暂定为“通用XXXX辅助平台”。其中有部分要做成【交互式绘图】功能,类似Visio。之前用过很少的GDI+,也就知道个皮毛。对GIS类软件能够实现数量庞大的图形元素进行绘制,感觉很不可思议,尤其是对绘制过的元素还可以进行再编辑,更是一头雾水。现在要用到类似功能了,因此也就开始查询、思考如何实现了。

在准备过程当中,测试了几种功能实现,也遇到了一些问题,其中:如何进行拖拽绘图?

最先想到的,肯定是在MouseMove事件中,实时的更新要绘制的图形坐标尺寸。原理没错,但是实际运用时,发现会出现大量的图形遗迹累积。常用方法有:

1.在绘制新图形时,在MouseMove中,先用背景色重绘上次的图形,再重新绘制新图形。(这只是个障眼法,在背景色为纯色,且绘制直线时,非常奏效;但是在绘制矩形等复杂图形时,仍然会有遗迹累积问题)

2.在MouseMove事件中,进行Invalidate,在OnPaint中进行实时绘制。(这种方法比较彻底,但比较浪费资源,拖拽过程中不断进行全局重绘,由此会有闪烁现象)

  2.1对于背景单一的绘图操作中,这种方法还是容易接受的,但是如果背景是个图片(尤其是来自文件的图片),那直接能闪瞎自己的美瞳!

  2.2对于处理背景复杂的图片,有个想法,就是类似于软件截图的做法:在绘图面板上添加一个画板visible设为false,在修改或者拖拽的时候visible=true,此时只将正在改变的图元画在隐藏画板上,并不断的进行Invalidate,当然为了做到效果更好一些,将隐藏面板的背景色设置为透明(方法:自定义继承panel类,利用SetStyle方法将SupportsTransparentBackColor设为True,然后再实例化该类即可)。这个想法,看似不错,但是在实现的时候,发现个问题:只要该面板显示时盖住已经绘制的图元,即使是完全透明的,图元也不会进行绘制!!更扯淡的是,在设置了绘图面板的背景图片时,图片是可以透过透明色看见的!!!更更扯淡的事,Win7的窗口标题栏是半透明的,透过这个半透明效果也是可以看到图元的!!!!Why?

  将Form.Opacity属性设置为小余1的数值,可以实现半透明效果,这就类似Win7的标题栏效果.确实能够解决遮挡问题,但是如果想在上面画图,又会遇到麻烦----画笔也变得半透明了,而且采用半透明效果,闪烁的情况更严重.为此,不得不放弃采用隐藏画板这条路.还是回到方法2.1上吧.