第2回 画像を表示する

ImageViewer02_01.gif
今回はいきなり画像(jpegファイル)をウインドウに表示する処理を作る。
Visual Studio 2005の左側にある「ソリューションエクスプローラ」にある「ImageViewerView.h」をダブルクリックして開く。cppファイルではなく、ヘッダーファイルであることに注意。


ImageViewer02_02.gif
もしもソリューションエクスプローラが見当たらない場合は、「表示」メニューから「ソリューションエクスプローラ」を選択すればいい。


ImageViewer02_03.gif
ImageViewerView.hが開いた。今まで変更を加えていないので、ATL/WTLアプリケーションウイザードが自動生成したままになっている。


ImageViewer02_04.gif
ここで、まずはファイルの先頭部分に3行追加する。ここでは画像の表示に「GDI+」と呼ばれるコンポーネントを利用する。これはそのコンポーネントを使うための定義になる。
GDI+を利用するにはgdiplus.hとgdiplus.libが必要なため、そのインクルードおよびリンク設定。「using namespace Gdiplus;」は名前空間の設定用だ。

今回は「とりあえず画像を表示する」ということに主眼を置いている。そのためこの定義は次回以降ほかの場所に移動することになる。
#include	"gdiplus.h"
#pragma	comment(lib,"Gdiplus.lib")
using namespace Gdiplus;


ImageViewer02_05.gif
次に赤枠で囲んだOnPaint関数の中に画像の読み込みおよび表示処理を追加する。ここでは「test.jpg」という画像ファイルを読み込み、ウインドウ内に元のサイズで表示している。

具体的な処理内容については次回以降に行うが、この部分の処理は本来やってはいけない使い方をしている。まずGDI+の解放処理はコメントアウトされているため実行されない。さらにOnPaint()は描画毎に呼ばれる関数のため、描画毎にGDI+の初期化や画像ファイルの読み込みを行っていて効率が悪い。そのためこの処理も今後大幅に変更することになる。
	LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		CPaintDC dc(m_hWnd);

		//GDI+初期化
		ULONG_PTR	_nToken;
		GdiplusStartupInput _sGdiplusStartupInput;
		GdiplusStartup(&_nToken,&_sGdiplusStartupInput,NULL);

		//画像読み込み
		Bitmap*		pImage;
		Graphics	cGraphics(dc.m_hDC);

		pImage = Bitmap::FromFile(L"test.jpg",TRUE);

		//画像表示
		cGraphics.DrawImage(pImage,(REAL)0,(REAL)0,(REAL)pImage->GetWidth(),(REAL)pImage->GetHeight());

		//画像開放
		delete	pImage;

		//GDI+開放処理
//		GdiplusShutdown(_nToken);
		return 0;
	}


ImageViewer02_06.gif
ソースコードに必要な変更を施したら実行してみる。まずは「ビルド」メニューの「ImageViewerのビルド」からビルドする。


ImageViewer02_07.gif
画面下部の「出力」ウインドウをチェックしてビルドが正常に終了したことを確認する。もしも失敗した場合はソースコードの変更部分を確認しなおす。


ImageViewer02_08.gif
ビルドが正常に終了したら実行する。「デバッグ」メニューにある「デバッグ開始」を選択する。


ImageViewer02_09.gif
これでプログラムが実行され、画像が表示されたウインドウが開いた。ここで読み込まれる画像ファイルはプロジェクトフォルダに保存された「test.jpg」になる。

次回はウインドウサイズに応じて画像を拡大・縮小表示する処理を追加しよう。


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


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