Monday, February 9, 2009

C/C++ , GDI , GDI+ 双缓冲解决窗口闪烁 (Windows API)

刚开始利用Windows绘图函数进行编程的时候,我老是觉得:为什么我的程序比别人的要显得卡.
后来才明白,原来大多数程序都使用了"双缓冲"技术. 然后我又有一个问题:为什么Windows不在内部实现双缓冲呢? 都来知道,在Vista有个WDM, 差不多就有一个双缓冲功能...

闲话少说:GDI实现双缓冲过程:

取得DC
  1. 创建一个位图:HBITMAP CreateCompatibleBitmap
  2. 创建两个个兼容内存DC:CreateCompatibleDC
  3. 两个DC分别绑定"要画的图"和"刚才创建的位图":SelectObject
  4. 把想画的样子画在"刚才创建的位图"上:BitBlt, StretchBlt等函数
  5. 把"刚才创建的位图"画在真正的DC上:BitBlt, StretchBlt等函数
  6. 释放该释放的东西,位图和内存DC:DeleteObject, DeleteDC

再来个GDI+的过程:
  1. 根据窗口大小建立合适的位图Gdiplus::Bitmap,并且给他创建Gdiplus::Graphics
  2. 取得DC,创建Gdiplus::Graphics
  3. 取得想画的图Gdiplus::Image
  4. DrawImage,把东西都画在Gdiplus::Bitmap上.
  5. DrawImage,把Gdiplus::Bitmap画在DC的Gdiplus::Graphics上
  6. 释放该释放的东西.

No comments:

Post a Comment