ちらつき防止 BitBlt winapi クラス化

BitBltとはそもそも

BIT BLock Transfer から、BitBltだそうです。*1

使い方

この質問サイトに書いてあるサンプルが一番いいでしょうか。
http://oshiete1.goo.ne.jp/qa3052870.html
こちらのを改造して使っています。実を言うとよく理解していません。

ちょっとクラス化してみた

2つ以上のまとったデータと処理が出てきたのでクラスにしてみました。まだ使いにくいです。

// Buffer.h
#pragma once
#include <windows.h>

// メモリデバイスコンテキストの機能をまとめたクラス.
class CBuffer
{
public:
	// コンストラクタ
	CBuffer()
	  : m_hdc(NULL),
		m_hBmp(NULL),
		m_BufIsCreated(false)
	{ }

	// デストラクタ
	~CBuffer()
	{
		Destroy();
	}

	// サイズを指定してバッファを作る. 失敗たら元のバッファのままになる.
	bool Create( HWND hWnd, int x, int y)
	{
		// 新しいバージョン 失敗した場合はそのままにしておく。
		bool rc = false;
		HDC hNewDC;
		HBITMAP hNewBmp;
		HDC hdc = GetDC( hWnd);
		if(hdc) {
			hNewDC = CreateCompatibleDC( hdc);
			if(hNewDC) {
				hNewBmp = CreateCompatibleBitmap( hdc, x, y);
				if(hNewBmp) {
					SelectObject( hNewDC, hNewBmp);
					Erase();
					rc = true;
				}
				else {
					DeleteDC( hdc);
				}
			}
			ReleaseDC( hWnd, hdc);
		}
		if(rc) {
			// 作成に成功した場合
			Destroy();	// 今あるものを破棄する
			m_size.SetSize( x, y);
			m_hdc = hNewDC;
			m_hBmp = hNewBmp;
			m_BufIsCreated = true;
		}
		// 作成に失敗しても、前に作られたものがあれば、m_IsCreatedはtrueのまま.
		return rc;
	}

	// バッファを破棄する. 仮に失敗しても続行はできる.
	void Destroy()
	{
		if(m_hBmp) {
			::DeleteObject( m_hBmp);
			m_hBmp = NULL;
		}
		if(m_hdc) {
			::DeleteDC( m_hdc);
			m_hdc = NULL;
		}
	}

	// バッファの背景を白く塗りつぶす.
	bool Erase()
	{
		SelectObject( m_hdc, GetStockObject(NULL_PEN));
		SelectObject( m_hdc, CreateSolidBrush(RGB(0xFF,0xFF,0xFF)));
		Rectangle( m_hdc, 0, 0, m_size.cx, m_size.cy);
		DeleteObject( SelectObject( m_hdc, GetStockObject(WHITE_BRUSH)));

		return true;
	}

	// バッファのデバイスコンテキストハンドルを得る
	HDC hdc()
	{
		return m_hdc;
	}
	operator HDC()
	{
		return m_hdc;
	}

	// サイズを返す
	int cx() const
	{
		return m_size.cx;
	}
	int cy() const
	{
		return m_size.cy;
	}

	// バッファが作られているかどうか(初期化されているかどうか)を返す
	bool IsCreated() const
	{
		return m_BufIsCreated;
	}

private:
	HDC m_hdc;
	HBITMAP m_hBmp;
	CSize m_size;
	bool m_BufIsCreated;

	// コンパイラに自動生成させない
	CBuffer &operator=( const CBuffer &right);
	CBuffer( const CBuffer &);
};

Createメソッドでは、m_hdcを何度も作り直さなくてもいい時だってあるはず。でも面倒だからいいや。