Windows XP以降に標準搭載されているGDI+を使うと、.NET Frameworkと同等のグラフィック機能をWin32APIベースのプログラムから使うことができます。GDI+のオブジェクトには、Visual C++からもC++のクラスとしてアクセスできるようになっているので、今回はGDI+のBitmapオブジェクトで画像ファイルを読み込んでみることにしましょう。 GDI+を使う手順は、以下の通りです。 GdiplusStartupInput()で初期化 ただし、これらのオブジェクトや関数はGdiplusというnamespace(C++の名前空間)の中にあるので、namespaceを先頭につけるかusingで名前空間を読み込んでおく必要があります。 今回試してみるBitmapオブジェクトは、GDI+のオブジェクトに描画したりGDIのHBITMAPに変換できるビットマップです。「画像ファイルのパス文字列」や「画像データを読み込んだIStream」からBitmapオブジェクトを作成するコンストラクタ・静的関数もあるので、GDI+で対応しているデータ形式の画像(BMP、PNG、Jpegなど)を簡単に扱うことができます。 たとえば、pngファイルを読み込んでBitmapを作るなら、以下のようにファイルのパス(ワイド文字列にする必要があるので注意)を引数にコンストラクタを呼び出すだけです。 g_bmp2 = new Gdiplus::Bitmap(L"d:/test.png"); 同様に、コンストラクタに画像データに関連付けたIStreamを渡すだけでBitmapを作ることもできます。 こうして作成したBitmapは、GraphicsオブジェクトのDrawImage()などで描画できます。Win32APIで扱うウインドウ上に描画する場合は、ウインドウのHDCやGDIビットマップのメモリデバイスコンテキストからGraphicsオブジェクトを作成することになるでしょう。 今回は、ウインドウのWM_PAINT処理で以下のようにしてみました。
プログラムソース表示(VC++用C++ソース) テストプログラムでは、二つの画像を読み込んで描画しています。ファイルのパスに適当な画像ファイルを指定し、どんな感じで描画されるか試してみましょう。g_bmp2の方が上に描かれるので、こちらのパスに透過pngを指定してみてください。 従来のAPIベースでは困難だったJpegやPNG(透過情報対応)画像ファイルも簡単に扱えるので、なかなか便利ですね。 |