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

解决方案 »

  1.   

    另一个帖子有人问:
    在对话框的OnPaint用CPaintDC pDC(this)获得DC类就可以画图, 为什么用GetDC()获得CDC类画图后就不能刷新?
    http://topic.csdn.net/u/20071128/16/36322828-3045-4f58-a46f-03b410549a77.html
    我正是用GetDC()的DC,会不会就是这个原因?
      

  2.   

    背景图片的句柄应该预先创建好并缓存起来,在OnEraseBkgnd里面直接使用该句柄进行绘制,窗口关闭之前不要销毁该句柄。
      

  3.   

    OnPaint中必须至少调用CPaintDC,或者手动调用BeginPaint/EndPaint函数(效果一致,消除无效矩形和消息队列中的WM_PAINT消息)。而CPaintDC获取的DC由于包含了无效区域,绘制的时候会得到优化。
      

  4.   

    我知道原因了。在内存缓存区的那种图片大小是1680×1050,.如果我把所有进程关了,或者把图片改小,或者拿到双核的电脑上运行,就不会导致绘制这张图时有时失败。
    应该是cpu在绘制这张图片时,切换到其它进程,导致绘制失败。我想解决办法就是把图片切割成几份显示,就不会因为太大而无法显示。我现在想知道的是,在其它地方定义的Bipmap怎么拿到OnPain里用????我想把所有东西绘制到这张Bipmap上,OnPain再绘制这张图片就行了,就是把双缓冲内存绘制的部分移到OnPain外进行,避免0.5秒的等待。
      

  5.   

    Bipmap全局的,然后需要显示时在OnPain绘制Bipmap
      

  6.   

    OnPaint中必须至少调用CPaintDC,或者手动调用BeginPaint/EndPaint函数(效果一致,消除无效矩形和消息队列中的WM_PAINT消息)。而CPaintDC获取的DC由于包含了无效区域,绘制的时候会得到优化。
      

  7.   

    问题解决了。我在OnEraseBkgnd里画图,onpaint画图代码全删了。用Invalidate(false)刷新。延迟150毫秒,没有任何闪烁,也不会出现全部没显示的现象了。我也不知道为什么。
    给你们送分。