实现绘图遇到的有关问题:怎样保存已绘制的图形?分不够了,不好意思

实现绘图遇到的问题:怎样保存已绘制的图形?分不够了,不好意思
本帖最后由 shimachao 于 2014-04-22 17:20:55 编辑
实现绘图遇到的有关问题:怎样保存已绘制的图形?分不够了,不好意思

如上图所示,我要实现一个矢量画图程序。为了实现画图过程中的交互效果。比如为了画一条直线。我把鼠标左键按下的第一个点设为直线的起始点。而鼠标左键弹起的点设为直线的终点。

在按住左键并拖动鼠标的过程中,为了将直线即时地显示出来又不留下划过的痕迹。我在鼠标移动的消息中是这样处理的
 
Pen whitepen(Color(255,255,255,255));
Pen pen(Color(255,0,0,0));
case  LINE:
graphics.DrawLine(&whitepen,m_OriginPoint.x,m_OriginPoint.y,prePoint.x,prePoint.y);
graphics.DrawLine(&pen,m_OriginPoint.x,m_OriginPoint.y,point.x,point.y);

用一个变量保存起始点,一个保存鼠标当前的点,还一个变量保存上一次鼠标所在的点。每次都用whitepen擦除上一瞬间即时显示的直线并绘制当前直线,来实现拖拽效果。

但是正如图中所示,这样虽然可以做到拖拽式绘图,但是在拖拽的过程中会擦掉图中原来已有的图形。
怎么解决这个问题呢?我在网上找到的一份的代码,也是这么做的,但是却没有这个问题。不过他用的是GDI+

我原来想到的一种方法:新建一个完全透明的窗口B覆盖在现有窗口A上,在B上绘图并实现拖拽效果,而在底下的窗口只管显示。这样绘图过程中就不会有擦除现象了。但是这样行不通,因为完全透明的窗口上面绘制的图形也完全看不到。



大家有什么好的办法吗?那些绘图软件又是怎么做到的。
------解决方案--------------------
必须将已经绘制的数据保留下来,比如保留到一个数组中,
重绘的时候要包含历史数据和当前正在操作的数据的重绘
(不要使用鼠标事件进行绘图,应该使用Invalidate激发重绘)
------解决方案--------------------
将已有数据保存起来(可以自定义数据结构放到列表中),每次鼠标移动的时候进行局部刷新,在onDrwa中把数据列表中的数据重新绘制,这样就可以了
------解决方案--------------------
http://blog.****.net/longzhishen/article/details/24254183 内含保存图像到 BMP 文件
------解决方案--------------------
引用:
Quote: 引用:

又是一个连数据结构都不懂就出来混的悲剧

好吧,我就是个悲剧,连问题都描述不清楚!


既然要画图,那就找个榜样吧
AutoCAD应该都知道吧

AutoCAD是用数据库保存图形的
但他即没用SQL,也没用ACCESS,自创

那么数据库到底是怎么回事情呢?
说白了复杂的就是个广义表
简单的就是个链表

你操作画图其实计算机执行了三个任务
1、把你鼠标键盘信息换算成图形数据
2、把图形数据添加到链表,或者从链表删除,或者修改
3、把链表数据画到窗口上

画的动作在OnPaint里一个循环就画完了
其他所有的动作都是操作链表,然后Invalidate

效率低不低不是你凭感觉判断
而是程序写好后的结果说了算

一张图你能画10000根线我算你狠
就算你画一万根线,同样不是你感觉能说了算的
何况用双缓冲,COPY的内容也最多你屏幕的范围