Windows GDIでダブルバッファリング

今更な話題ですがメモ。

「CreateCompatibleDC」を使って、描画を行いたいウインドウのデバイスコンテキストと 同じ属性のデバイスコンテキストを作成して、そこに描画処理して、本来の方へコピーをする感じですね。

注意点としては。
・「CreateCompatibleBitmap」でメモリ上の描画エリアのサイズなどを確定します。また、ベースになるHDCは「CreateCompatibleDC」で作成したものを使用しないのがミソです。
・ペンやブラシなどを作成して最後に削除しますが。SelectObjectでデバイスコンテキストに関連付けたままだと作成されたビットマップが開放されないので激しくメモリリークを起こします。
・定数の「COLOR_STATIC」は、WinCEのみのようです。

では、サンプル。

void TestDraw(HDC hDC)
{
HDC hCDC;
HBITMAP hCBitmap,hOldCBitmap;
HPEN hPen,hOldPen;
HBRUSH hBackGround,hOldBG;
RECT rs;

int width=200,height=100;

hCDC = CreateCompatibleDC(hDC);
hCBitmap = CreateCompatibleBitmap(hDC,width,height); //これ重要。
hPen = CreatePen(PS_SOLID,1,RGB(0,0,0));
hBackGround = CreateSolidBrush(RGB(255,255,255));

hOldCBitmap = (HBITMAP)SelectObject(hCDC,hCBitmap);

//背景
rs.left = 0;
rs.top = 0;
rs.right = width;
rs.bottom = height;
FillRect( hCDC, &rs,(HBRUSH)GetSysColorBrush(COLOR_STATIC));

//枠と塗りつぶし
hOldPen = (HPEN)SelectObject(hCDC,hPen);
hOldBG = (HBRUSH)SelectObject(hCDC,hBackGround);
Rectangle(hCDC,10,10,width-10,height-10);
SelectObject(hCDC,hOldBG);
SelectObject(hCDC,hOldPen);

//メインメッセージ
SetTextColor(hCDC,RGB(255,0,0));
SetBkColor(hCDC,RGB(255,200,200));
ExtTextOut(hCDC,30,40,ETO_OPAQUE,NULL,TEXT("Hello World!"),_tcslen(TEXT("Hello World!")),NULL);

//ウインドウへコピー
BitBlt(hDC,50,50,width,height,hCDC,0,0,SRCCOPY);

SelectObject(hCDC,hOldCBitmap);

DeleteObject(hBackGround);
DeleteObject(hPen);
DeleteObject(hCBitmap);
DeleteDC(hCDC);

return;
}