C++GDI+デュアルキャッシュ技術実現


以前、この問題についてCSDNで助けを求めたことがあります(GDI+はデュアルバッファで画像を描く方法をどのように使うか)、GDI+の下で実行可能な方法を得ました.直接描くよりも効果的ですが、GDIのデュアルバッファ方式と肩を並べることはできません.
今、私はついに1つの理想的な実現方式を見つけて、効果はGDIの実現と肩を並べて、コードは以下の通りです:
/*C++ code*/
RECT rc;
GetClientRect(g_hwnd,&rc);
Bitmap bmp(int(rc.right),int(rc.bottom));

Graphics bmpGraphics(&bmp);
bmpGraphics.SetSmoothingMode(SmoothingModeAntiAlias);

/*Drawing on bitmap*/
SolidBrush bkBrush(Color(0,0,0));
bmpGraphics.FillRectangle(&bkBrush,0,0,rc.right,rc.bottom);

/*Drawing on DC*/
Graphics graphics(hdc);
/*Important! Create a CacheBitmap object for quick drawing*/
CachedBitmap cachedBmp(&bmp,&graphics);
graphics.DrawCachedBitmap(&cachedBmp,0,0);

以上のペイントコードがネットワーク上の他のGDI+実装と最も異なる点は、最後にCacheBitmapオブジェクトを追加して高速ペイントすることです.
CacheBitmapは、bmpのすべての画素を含み、graphicsに関連付けられたDCに対して特に最適化されたビットマップオブジェクトである.この点はその構造パラメータから見ることができる. 
デュアルバッファの実装には、デュアルバッファ実装の核心ではないが、まだ重要な点がある.常にバックグラウンドを再描画する必要がある場合は、WM_を自分でブロックする必要があります.ERASEBKGNDメッセージ、そして処理関数の中で何もしないで、つまりこのメッセージが発生する時背景を再描画しないで、背景の再描画はWM_PAINTで全権制御.
例えば、WM_ERASEBKGNDメッセージ処理の実現
void OnEraseBkGnd(HDC hdc)
{
 //do nothing
}

添付:
GDIのデュアルバッファ実装
RECT rc;
 GetClientRect(hwnd,&rc);
 HDC hMemDc = CreateCompatibleDC(hdc);
 HBITMAP hBmp = CreateCompatibleBitmap(hdc,rc.right,rc.bottom);
 HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDc,hBmp);
 //    hMemDc   GDI   
 BitBlt(hdc,0,0,rc.right,rc.bottom,hMemDc,0,0,SRCCOPY);
 SelectObject(hMemDc,hOldBmp);
 DeleteObject(hBmp);
 DeleteObject(hMemDc);

転載先:http://cnbeta2004.blog.163.com/blog/static/602313402010119104451537/