メモリデバイスのためのクラスを作ります。
クラス名は、MyMemoryDCとします。
#ifndef ___MYMEMORYDC #define ___MYMEMORYDC // メモリデバイスクラス class MyMemoryDC{ private: HBITMAP hBitmap; public: HDC hdc, hdcOrg; int width, height; public: // コンストラクタ MyMemoryDC(HDC hdc1, int width1, int height1){ hdcOrg = hdc1; width = width1; height = height1; // hdc1 と同等なメモリデバイスを作成 hdc = CreateCompatibleDC(hdc1); // hdc1 と同等なビットマップ形式を作成 hBitmap = CreateCompatibleBitmap(hdc1, 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)); // 黒い線 } // デストラクタ ~MyMemoryDC(){ DeleteDC(hdc); DeleteObject(hBitmap); } // メモリデバイスをコピー void BitBlt(int x, int y){ ::BitBlt(hdcOrg, x, y, width, height, hdc, 0, 0, SRCCOPY); } }; #endif
前と同じことをするクラスを作ります。
// メモリデバイス用変数 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);
MyMemoryDC クラスを作ります。
// メモリデバイスクラス class MyMemoryDC{ };
メンバーを追加します。 このメンバーは、このクラスの中だけで使うのは、"private:" を付けます。
private: HBITMAP hBitmap; public: HDC hdc, hdcOrg; int width, height;
次に、メモリデバイスのサイズを指定したり、メモリデバイスを作成をします。 これは、MyMemoryDCクラスのメンバーの初期化と考えられます。 こんなとき、コンストラクタを使います。 これは、クラスの変数を宣言したとき、自動で呼び出され、実行してくれます。 関数のように、引数を付けることができます。 引数でメモリデバイスのサイズを指定します。 ついでに、画面の初期化もしておきます。
public: // コンストラクタ MyMemoryDC(HDC hdc1, int width1, int height1){ hdcOrg = hdc1; width = width1; height = height1; // hdc と同等なメモリデバイスを作成 hdc = CreateCompatibleDC(hdc1); // hdc と同等なビットマップ形式を作成 hBitmap = CreateCompatibleBitmap(hdc1, 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)); // 黒い線 }
次は、メモリデバイスを使い終わったら、それを開放しなければなりません。 こんなとき、デストラクタを使います。 これは、クラスを使い終わったとき、自動で呼び出されます。
// デストラクタ ~MyMemoryDC(){ DeleteDC(hdc); DeleteObject(hBitmap); }
最後に、BitBltメソッドも作りました。 クラスでは、関数もメンバーに加えることができます。
"MyApp.h" です。
// // MyApp.h // class MyApp : public MyMainWnd{ public: // WM_PAINT void wmPaint(HDC hdc){ // メモリデバイス MyMemoryDC mdc(hdc, 400, 200); MyDC g(mdc.hdc); // メモリデバイスに描画 // 直線を描く---------------------------- g.MoveTo(10, 10); g.LineTo(100, 100); // スクリーン画面へコピー mdc.BitBlt(0, 0); } };
実行画面です。
一応、メモリデバイスに描画しているような気になります。