直接、画面に描画しないで、メモリに描画します。 これは、描画している所を見せたくない時などに使います。 これを、メモリデバイス、あるいはダブルバッファといいます。
"MyApp.h" です。
//
// MyApp.h
//
class MyApp : public MyMainWnd{
public:
// WM_PAINT
void wmPaint(HDC hdcMain){
// メモリデバイス用変数
HDC hdc;
HBITMAP hBitmap;
int width, height;
// メモリデバイスのサイズ
width = 400;
height = 200;
// 画面と同等なメモリデバイスを作成
hdc = CreateCompatibleDC(hdcMain);
// 画面と同等なビットマップ形式を作成
hBitmap = CreateCompatibleBitmap(hdcMain, width, height);
// メモリデバイスをビットマップ形式に設定
SelectObject(hdc, hBitmap);
// メモリデバイスに描画---------------------------------
// 画面の初期化(背景を白で塗りつぶす)
SelectObject(hdc, GetStockObject(WHITE_PEN)); // 白いペン
SelectObject(hdc, GetStockObject(WHITE_BRUSH)); // 白いブラシ
Rectangle(hdc, 0, 0, width, height);
SelectObject(hdc, GetStockObject(BLACK_PEN)); // 黒いペン
// 直線を描く----------------------------
MoveToEx(hdc, 10, 10, NULL);
LineTo(hdc, 100, 100);
//---------------------------------------
// 画面へコピー
BitBlt(hdcMain, 0, 0, width, height, hdc, 0, 0, SRCCOPY);
// メモリデバイス開放
DeleteDC(hdc);
DeleteObject(hBitmap);
}
};
実行画面です。
まず、赤い部分を見てください。 直線を描いています。 第1引数には、どこへ描くのか指定します。 実は、メモリ画面=hdcになっています。 ですから、メモリ画面に描画しています。
このままでは結果が見えないので、画面にコピーします。 これは、BitBlt関数を使います。 画面=hdcMain です。
// 画面へコピー BitBlt(hdcMain, 0, 0, rc.right, rc.bottom, hdc, 0, 0, SRCCOPY);
メモリ画面を、メモリデバイスといいます。 それでは、メモリデバイスの作り方を説明します。
まず、変数を2つ用意します。 HDC型と、HBITMAP型の2つです。 ところで、メモリデバイスのサイズも必要になります。
// メモリデバイス用変数 HDC hdc; HBITMAP hBitmap; int width, height; // メモリデバイスのサイズ width = 400; height = 200;
CreateCompatibleDC関数を使って、hdc=メモリデバイスにします。 さらに、CreateCompatibleBitmap関数を使い、画面のような性質、ビットマップ形式を取得します。 このとき、サイズも指定します。 このため、画面と違うサイズにすることもできます。 そして、SelectObject関数を使って、メモリデバイスをビットマップ形式にします。
// 画面と同等なメモリデバイスを作成 hdc = CreateCompatibleDC(psMain.hdc); // 画面と同等なビットマップ形式を作成 hBitmap = CreateCompatibleBitmap(hdcMain, width, height); // メモリデバイスをビットマップ形式に設定 SelectObject(hdc, hBitmap);
これで、hdcに描画できます。 描画が終わったらメモリデバイスを開放します。
// メモリデバイス開放 DeleteDC(hdc); DeleteObject(hBitmap);
さて、もう1つ説明が残っています。 それは、メモリデバイスを用意したとき、そこにはゴミのデータが入っています。 ですから、背景を塗っておく必要があります。 それには、Rectangle関数を使います。 これは、長方形を描画する関数です。 ですから、周りの線を白で描き、中を白で塗ります。
// 画面の初期化(背景を白で塗りつぶす) SelectObject(hdc, GetStockObject(WHITE_PEN)); // 白いペン SelectObject(hdc, GetStockObject(WHITE_BRUSH)); // 白いブラシ Rectangle(hdc, 0, 0, width, height);