メモリデバイスコンテキスト

アプリケーションがスクリーン表面にビットマップを表示する場合、
ウィンドウのデバイスコンテキストに直接ビットマップオブジェクトを
設定することはできません。
ビットマップオブジェクトは、メモリデバイスコンテキストのオブジェクトに
一度設定した後、
デバイスコンテキスト間のコピーを行う事でウィンドウへ描画されます。
CreateCompatibleDC()関数は、指定されたデバイスと
互換性のあるメモリデバイスコンテキストを作成します。

HDC CreateCompatibleDC(
 HDC hdc
);

メモリデバイスコンテキストは仮想デバイスなので、
このデバイスが扱うビットマップが必要になります。
CreateCompatibleBitmap()関数は、指定されたデバイスと
互換性のあるビットマップを作成します。

HBITMAP CreateCompatibleBitmap(
 HDC hdc,
 int nWidth,
 int nHeight
);

このビットマップを互換性のあるメモリデバイスコンテキストに
SelectObject()関数を使って設定すれば、
この仮想画面に通常のグラフィック描画関数を使って描画できます。

CreateCompatibleBitmapは使用しなくても表示は可能ですが、
いくつも画像を重ねる場合は仮想画面にまとめて描画してから
転送した方がちらつきが抑えられると言われています。


かなり抜粋

HDC hdc;
static HDC hMemDC;
static HBITMAP hBitmap;

hdc = GetDC( hWnd );
// ウィンドウと同じ仮想画面を作る
hMemDC = CreateCompatibleDC( hdc );
hBitmap = CreateCompatibleBitmap( hdc, 640, 480 );
SelectObject( hMemDC, hBitmap );
ReleaseDC( hWnd, hdc );


※デバイスコンテキストに対するオブジェクトの設定は、
そのデバイスコンテキストが解放されるまで有効です。
※オブジェクトの設定はデバイスの取得ごとに行う必要があります。
※任意に生成したカスタムオブジェクト自体は、
DeleteObject()関数によってオブジェクトが消去されるまで有効です。
カスタムオブジェクトはアプリケーションの終了時には
すべて消去していないといけません。
※デバイスコンテキストは不要になったらDeleteDC()関数を呼び出して
デバイスコンテキストを解放しなければいけません。


DeleteDC( hMemDC ); // メモリデバイスコンテキストの消去
DeleteObject( hBitmap ); // ビットマップオブジェクトの消去

Windows > グラフィック | comments (0) | trackbacks (0)

Comments

Comment Form

icons:

Trackbacks