ちらつき防止 BitBlt winapi クラス化
使い方
この質問サイトに書いてあるサンプルが一番いいでしょうか。
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を何度も作り直さなくてもいい時だってあるはず。でも面倒だからいいや。