我的view类继承了CScrollView类,视图大小比屏幕要大,因此需要滚动条才能看到下面的内容。因为基本上要在整个视图上花不同颜色的点,所以直接画到屏幕上每次重绘都很慢。所以我试着在内存中开辟了一个同视图一样大的位图(比屏幕要大),在位图中画出那些点,然后用BitBlt函数把内存视图拷贝到屏幕上。但是速度还是很慢。我程序中还有滚动条滚动和鼠标按下的消息响应函数,它们在执行过程中要发生窗口重绘,每次重绘时屏幕都会变白,然后再过三四秒甚至四五秒钟才能出来效果,实在是太慢了。我希望的效果是看不出来重绘.请问该如何解决??

解决方案 »

  1.   

    试试这个。BOOL CXXXX::OnEraseBkgnd(CDC* pDC) 
    {
    return TRUE;
    }
      

  2.   

    提高不了,一是可能你的计算量很大或者很复杂,这里就耗时间,二是如果像素很多,gdi就会很慢。你的情况唯一能改善的就是(当然或者你改变生成图像的计算过程,内嵌汇编速度会快很多)在用户释放鼠标的时候再开始计算重绘,而不是拖一点算一点(就像Windows图片和传真查看器那样,松开手才会变)。最后,如果真的是gdi性能不佳的原因,那可能你要放弃gdi,使用其他绘图方式,比如opgl或d3d,就像3dmax里的视图那样。
      

  3.   

    内存中创建一个大位图然后在将它BitBlt到屏幕,中间在有一个不断刷新造成反复绘制。这些哪一点都是耗时的,想法避免不这么做
      

  4.   


    个人认为gdi还是可以的,感觉比gdi+强多了(在速度方面),建议楼主还是好好研究下自已的绘制方法及算法
      

  5.   

    谢谢大家!问题解决一些,之前我把绘图的函数写在了OnDraw函数中,所以每次都会在画一遍,现在我把绘图的函数写在了外面,速度快了很多。但是还是有别的问题,就是我绘图的宽度大于屏幕的宽度,因此要有个横向滚动条,每次滚动一下就要重绘一次速度很慢。老板说画好的部分直接粘到滚动后的位置上上,就画新的部分。请问该怎么粘啊?要用到什么函数?
      

  6.   

    双缓冲应该用了吧?
    你每次滚动之后把需要画的memdc的坐标位置画到屏幕dc就ok了
      

  7.   

    View不用集成继承CScrollView类.
    你就使用CView就可以了.每次你在View中需要显示什么就绘什么,双缓存是肯定需要的.
    主要是每次滚动的时候先计算屏幕的View占整个View的那个区域.然后根据数据重绘这个区域.
    之前试过110000*200000的大图,鼠标Move\滚动都丝毫没有问题.其实再大的图道理也一样,应该不会慢到哪里去.
    每次画好的部分作为下次画的背景或者移动位置而只重新画新增的部分确实能省N多的时间.如你老板所说.
      

  8.   

    我现在是这样做的:在内存位图中把要画的东西画全,在OnDraw函数中用BitBlt函数把内存视图拷贝到屏幕上,这样CScrollView的滚动条滚动的时候基本不影响。当自己创建的小滚动条滚动的时候,再在OnDraw函数中用BitBlt函数把需要出现的部分拷贝到屏幕上盖住之前的部分,而不是重新画图,这样速度也是很快的,不过有些闪烁。但总感觉盖住之前的部分有点别扭。大家觉得这样可以么?