请教:关于msdn中DRAWCLI的优化

haven_t 2008-05-28 11:04:39
msdn中DRAWCLI在编辑改变画面时会实时地更新画面,这样就需要在mousemove时进行重绘画面,如果画面元素太复杂时则影响较大,现我想修改一下,编辑改变画面图案时使用tracker(类似早期office文本框移动时虚线矩形效果)代替实际的图形,在LButtonUp 时才对画面进行重绘。分析了DRAWCLI中代码,发现到当移动一个CDrawObj时MoveTo函数在改变m_position前后分别调用了一次pView->InvalObj(this),后者则调用InvalidateRect(rect, FALSE)。由于InvalidateRect并不立即直接调用OnDraw,而是发送wm_paint消息,两个InvalidateRect合并为一个cliprect,然后在OnDraw中绘制。但这样会受到移动图案的起止点的影响,试想如果把图案从client 区的左上角移动到右下角,合并后的InvalidateRect可能就跟client差不多了,为了进一步优化,我想对m_position改变前后的两个InvalidateRect分别进行重绘。
现在的问题是如何分别对两个无效区进行重绘。我曾设想第一个InvalidateRect(rect, FALSE)后自己调用OnDraw,再把wm_paint删除,然后才调用第二个InvalidateRect(rect, FALSE)。但这个方法比较笨,不知道大家有没有更优雅的处理办法呢?
...全文
185 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
stevenkoh 2012-05-23
  • 打赏
  • 举报
回复
关注中!
rodney1983 2008-06-17
  • 打赏
  • 举报
回复
关注
haven_t 2008-05-31
  • 打赏
  • 举报
回复
感谢Mackz兄的指点!

但如果使用region的话那么bitblt怎样从内存dc向目的dc拷贝?
如果抛弃内存dc而直接在显示区域上重绘的话效率可能更低,因为一些与该剪切区域相交的对象被重绘的话,那么覆盖在该对象上的对象也要被重绘,形成一个链式重绘。
菜牛 2008-05-30
  • 打赏
  • 举报
回复
在OnDraw中用GetClipRgn获取剪切区域,然后判断对象区域与这个区域相交的才重绘。

19,468

社区成员

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

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