直接、画面に描画しないで、メモリに描画します。 これは、描画している所を見せたくない時などに使います。 これを、メモリデバイス、あるいはダブルバッファといいます。
"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);