为什么对话框刷新时显示OnPain里的图片后马上消失,只剩下背景。急

ljooo 2008-06-15 02:11:10

我在对话框的OnPaint里用GDI+的双缓冲画图,有几百个小图片。在OnEraseBkgnd改了背景图。
1 为什么在没有任何操作(移动窗口,切换程序等)的情况下有时对话框自己会自动刷新。刷新一次要等半秒。偶尔刷新后界面除了背景图,什么都没有。
2 为什么我调用Invalidate后,界面刷新,图片显示一会(0.1秒)后马上消失(估计又刷新了一次,但没有绘制OnPaint里的东西),只剩下背景图。应该跟上面是同个问题。
3刷新一次要等半秒,这段时间界面没东西。请问:我可以把上一次OnPaint的界面保存成图片,在下次调用OnPaint时先绘制保存的图片,再用双缓存作图吗
4 Image可以用数组吗?在对话框里类的头文件里新建Image变量不能初始化,而Image声明时好像必须初始化,难道Image不能作为类的属性(只能做局部变量)?用指针是可以解决,但对话框退出时,指针在哪里释放,我在析构那里释放出错。

我是初学者。在网吧等,很急。明天给分。
...全文
194 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljooo 2008-06-18
  • 打赏
  • 举报
回复
问题解决了。我在OnEraseBkgnd里画图,onpaint画图代码全删了。用Invalidate(false)刷新。延迟150毫秒,没有任何闪烁,也不会出现全部没显示的现象了。我也不知道为什么。
给你们送分。
scq2099yt 2008-06-16
  • 打赏
  • 举报
回复
Bipmap全局的,然后需要显示时在OnPain绘制Bipmap
ljooo 2008-06-16
  • 打赏
  • 举报
回复
我知道原因了。在内存缓存区的那种图片大小是1680×1050,.如果我把所有进程关了,或者把图片改小,或者拿到双核的电脑上运行,就不会导致绘制这张图时有时失败。
应该是cpu在绘制这张图片时,切换到其它进程,导致绘制失败。我想解决办法就是把图片切割成几份显示,就不会因为太大而无法显示。

我现在想知道的是,在其它地方定义的Bipmap怎么拿到OnPain里用????我想把所有东西绘制到这张Bipmap上,OnPain再绘制这张图片就行了,就是把双缓冲内存绘制的部分移到OnPain外进行,避免0.5秒的等待。
skinfeature 2008-06-16
  • 打赏
  • 举报
回复
OnPaint中必须至少调用CPaintDC,或者手动调用BeginPaint/EndPaint函数(效果一致,消除无效矩形和消息队列中的WM_PAINT消息)。而CPaintDC获取的DC由于包含了无效区域,绘制的时候会得到优化。
菜牛 2008-06-16
  • 打赏
  • 举报
回复
OnPaint中必须至少调用CPaintDC,或者手动调用BeginPaint/EndPaint函数(效果一致,消除无效矩形和消息队列中的WM_PAINT消息)。而CPaintDC获取的DC由于包含了无效区域,绘制的时候会得到优化。
jameshooo 2008-06-15
  • 打赏
  • 举报
回复
背景图片的句柄应该预先创建好并缓存起来,在OnEraseBkgnd里面直接使用该句柄进行绘制,窗口关闭之前不要销毁该句柄。
ljooo 2008-06-15
  • 打赏
  • 举报
回复
另一个帖子有人问:
在对话框的OnPaint用CPaintDC pDC(this)获得DC类就可以画图, 为什么用GetDC()获得CDC类画图后就不能刷新?
http://topic.csdn.net/u/20071128/16/36322828-3045-4f58-a46f-03b410549a77.html
我正是用GetDC()的DC,会不会就是这个原因?

15,978

社区成员

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

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