第5回 ウインドウの"ちらつき"をなくす


ImageViewer05_01.gif
前回までに作成したソースコードでは画像は表示される。しかしウインドウサイズを変えると画像がちらついてしまった。

ImageViewer05_02.gif "ちらつき"はWM_PAINTが送られてくる前、つまり画像を描画する前にウインドウの背景が白く塗られていることによる。そのためウインドウの背景を塗るときに送られてくるメッセージを無効化してしまえばいい。 ウインドウの背景を塗るときのメッセージはWM_ERASEBKGNDだ。これをメッセージマップに追加して何もしない処理をする。
	BEGIN_MSG_MAP(CImageViewerView)
		MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
		MESSAGE_HANDLER(WM_PAINT, OnPaint)
		MESSAGE_HANDLER(WM_CREATE, OnCreate)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
	END_MSG_MAP()
	//背景描画(何もしない)
	LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		return	0;
	}

ImageViewer05_03.gif
これで実行するとウインドウサイズを変えてもちらつきなくスムースに表示できるようになった。

今回のWM_ERASEBKGNDが使われないようにする、という方法は画像表示ソフトに限らず様々な場面で利用されている。


ImageViewer05_04.gif
ちなみに画像を描画するためのOnPaint()が動かないようにすると...背景が描画されないため、ウインドウサイズを変えると枠の部分が残って変な描画内容になる。


プロジェクトファイルをダウンロード


カテゴリー「画像表示ソフトを作る」 のエントリー