如果我要用CDC在客户区画一个圆,很简单,用Ellipse这个函数就可以了。
但是我不是要用这种方法画圆,我想用点把这个圆给填充上去,因为圆中的每一个点的象素值都不相同,其实也有办法,
SetPixelV就可以了,我试过了,在我的电脑上,用大约4秒的时间就可以把整个圆给填完,我的CPU是奔四3.0,但是这个时间实在是太长了,因为某种原因,我必须在1秒钟之内把这个圆给填充完毕。不猜可能是因为CDC::SetpixelV本身的调用太费CPU了,所以时间满。我想到一个方法就是,把所以的点先存到内存的某一个区域,且把该点的值也存在内存里,用一个线程专门来读取这段内存中的RGB值,但是恐怕不能用CDC里的函数里,因为速度太慢。不知道有没有比较底层一点或者直接一点的光栅操作,我最近一段时间一直在想这个问题,可还是没有头绪。真心希望对GDI有研究的达人能祝一臂之力,只要说出大概的方向或方法就可以。

解决方案 »

  1.   

    LZ,如果想使用底层的操作的话,可以用DirectDraw技术.我推荐你使用CBrush::CreatePatternBrush和Ellipse方法
      

  2.   

    感谢CharlesPrince用DirectDraw不失为一个好办法,这几天现学习一下DirectDraw吧,正好利用这个机会接触一下;
    感谢limanage和luoshayu,你么的方法绝对可行,只是我没说清楚,不可以一次贴上,要一个点一个点的贴上,一个象素一个象素的画。
    如果有其他达人有好的方法,盼望赐教。
      

  3.   

    你说的一个像素一个像素的画是什么意思,是因为每个像素的颜色都不一样吗?为什么不可以一次贴上,而要一个点一个点的画?你是要实现动画效果吗?那为什么又要在一秒之内完成?你画的是实心圆还是空心圆?圆的大小是固定的吗,还是会随着客户区的变化而变化?呵呵,楼主的问题没有说清楚。我觉得你可以在内存中生成一个位图结构,大小根据需要定义,然后填充像素,最后画到界面上,或者用内存DC,这些都要比SetPixelV一个点一个点画要快
      

  4.   

    一个圆所包含的象素点数大概为1024×1024个,每一个点的RGB都不一样,必须画出这样一种效果:第一个点在显示器上显示出来,然后第二个点在显示器上显示出来,,,一直到第1024×1024个点在显示器上显示出来,之所以要这样画,不是我变态,而是我所做的项目必须如此,所以不可以贴图,我也知道贴图快啊。我想DirectDraw应该可以实现的,它可以同构hal device直接和显卡打交道。
      

  5.   

    你如果用DirectDraw来做这个的话,不见的效率就高多少,你在操作表面的时候还是要用GDI函数。
      

  6.   

    OpenGL 的glPoint()函数,试试.
      

  7.   

    双缓冲,一次更新一个点,应该也比SetPixelV快,不过1024*1024个点要在一秒种之内逐点动态的画完,刷新频率为1MHz,不太可能。就算可以画,那效果和逐行画刷新一千次,甚至一次画十行刷新一百次区别不大。