清空DC的办法?

xiaokun111 2010-09-19 07:48:36
用GDI命令在EMF DC中绘图,然后存为EMF文件,EMF文件中会保存着一系列绘图的命令:
如果绘图一半时发现绘制错误,目前的办法是通过白色填充来覆盖以前绘制的痕迹,
这样会在EMF文件中留有一堆废弃的GDI命令,会使EMF增大。
能否用一种方法,在发现绘制错误时,将DC清空重新绘制?

前题是同一个EMF DC,不能新生成EMF DC。
...全文
424 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hastings 2010-09-20
  • 打赏
  • 举报
回复
~~自己设计个结构表示各种GDI命令,画一个存一个进链表~~哪一个错了,就从链表中删除哪一个~~
fandh 2010-09-20
  • 打赏
  • 举报
回复
这个没有什么好的办法,所有的GDI资源,你创建了,那么,你就得释放!特别是有些资源被设备在使用,你反而释放不了,所以,你必须保证,在释放前,恢复设备的环境!这点很重要!
比如顶一个pen
CPen pen(solid,1,rgb());
CPen *poldPen = pDC->SelectObject(&pen);
.............//画图
pen.DeleteObject();//前面没有调用pDC->SelectObject(poldpen);这时候DeleteObject返回false;删除不成功!
如果,在pen.DeleteObject();前调用pDC->SelectObject(poldpen);恢复一下设备环境,那么,删除就没有问题了!资源就能释放成功!
fandh 2010-09-20
  • 打赏
  • 举报
回复
这种情况下,估计只有多分解、多封装来解决这个复杂的问题了!
微软的这个,的确用起来比较难受!
xiaokun111 2010-09-20
  • 打赏
  • 举报
回复
看来没什么办法了,在EMF DC中绘制,GDI命令就像是泼出去的水了难以收回
比如新建一个EMF,在EMF DC中绘制复杂的图形,可能会用到几千行的GDI命令,
如果绘制成功则EMF文件有200K.
如果绘制完时发现绘制出错,则只能由白色底刷填充整个DC,再重新绘制,
这样存储后的EMF文件大小为400K,有一半都是垃圾命令,还清除不了。
Hiiishe 2010-09-20
  • 打赏
  • 举报
回复
那BeginPath和EndPath呢?
xiaokun111 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hucailai 的回复:]
先释放,然后重新申请行吗?
[/Quote]

这不是我需要的答案,我需要的是清除以前GDI的命令
hucailai 2010-09-19
  • 打赏
  • 举报
回复
先释放,然后重新申请行吗?
xiaokun111 2010-09-19
  • 打赏
  • 举报
回复
关键是GDI命令画在DC上犹如泼出去的水不能收回
xiaokun111 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visualeleven 的回复:]
可以参考绘图中的Undo Redo的做法
[/Quote]

具体怎么做?

bb = getdc(0);
aa = savedc(bb);
Ellipse(bb,50, 50, 300, 500);
RestoreDC(bb,aa);
如果用SaveDC和RestoreDC椭圆还是画在了屏幕上
tubo_true 2010-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jcily 的回复:]

准备绘制开始时调用
int m_nPreSave = SaveDC();

遭遇错误时
if ( ERROR() )
RestoreDC(m_nPreSave);
[/Quote]
先DeleteObject,然后ReleaseDC
up
Abcix 2010-09-19
  • 打赏
  • 举报
回复
先DeleteObject,然后ReleaseDC
Eleven 2010-09-19
  • 打赏
  • 举报
回复
可以参考绘图中的Undo Redo的做法
Hiiishe 2010-09-19
  • 打赏
  • 举报
回复
准备绘制开始时调用
int m_nPreSave = SaveDC();

遭遇错误时
if ( ERROR() )
RestoreDC(m_nPreSave);

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧