グラフィックス

メモリデバイスのためのクラスを作ります。

MyMemoryDCクラス(MyMemoryDC.h)

クラス名は、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メソッドも作りました。 クラスでは、関数もメンバーに加えることができます。

MyMemoryDCクラスの使用例(win149)

"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);
	}
};

実行画面です。

解説

一応、メモリデバイスに描画しているような気になります。


[前] [目次]