グラフィックス

直接、画面に描画しないで、メモリに描画します。 これは、描画している所を見せたくない時などに使います。 これを、メモリデバイス、あるいはダブルバッファといいます。

メモリデバイス(ダブルバッファ) (win148)

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

[前] [目次] [次]