メモリデバイスのためのクラスを作ります。
クラス名は、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);
}
};
実行画面です。
一応、メモリデバイスに描画しているような気になります。