というわけで、一度、GDI+を使っておきたいと思っていました。もちろん、.NET FrameworkでWindowsアプリケーションを書けば自動的に使用されるらしいのですが、それでは意味がありません。生のGDI+を直接使う、C++の生APIの世界でなければなりません。
GDI+を使用して、JPEG画像の描画、線の描画、文字列の描画を行います。プログラム本体は、MFCもATLも使わない、ほとんどgenericという内容です。WM_PAINTの処理のみ、GDI+を利用して行います。
(いや、今時のプログラマにはgenericは既に通じないのではないかという悪い予感もしますが、Visual Studio.NETでWin32アプリの初期状態で生成されるものと思えば良いでしょう。実際、それにGDI+による描画コードを書き足していますし)
まず、JPEG画像のデコードを全てGDI+がやってくれました。もう、JPEG Independent Group(だったか?)のソースを取り込む必要もありません。そんなの、今時のシステムでは当たり前という気がしますので、これは年寄りのぼやきと思って下さい。
それから、文字がボックス範囲に自動的に整形されているのも素晴らしいですね。昔は、ExtTextOutあたりを使って、文字列を複数行に渡って描画させようと思ったら、アプリ側で文字列を行単位で分解してやる必要がありました。(まあ、DrawTextなんていうAPIもありましたが……。あれはある種の用途を意図した特種なAPIという感じがありますので、ちょっと違う印象も……)
void drawByGdiPlus( HDC hdc )
{
// GDI+のGraphicsオブジェクトを用意して描画準備
Gdiplus::Graphics graphics(hdc);
// 画像を描いてみよう
// 再描画するごとにファイルを読み込んでは効率が悪すぎだ!
// でも、学習用サンプルソースなので許す
Gdiplus::Image image(L"..\\test.jpg");
graphics.DrawImage( &image, 0, 0 );
// 線を引いてみよう
// 太さ16.0fで太い線だ!
// アルファブレンディング値を半分(128)にしているので透過するぞ
Gdiplus::Pen pen(Gdiplus::Color(128,255,0,0), 16.0f);
// ダッシュ・ドット・ドットのスタイルに設定
pen.SetDashStyle( Gdiplus::DashStyleDashDotDot );
graphics.DrawLine(&pen,0,0,500,500);
// 文字を描いてみよう
// GDI+はWideキャラクタじゃないと受け付けてくれないぞ
// ついに、シフトJISは相手にもされなくなってしまったらしいぞ
WCHAR dokidoki[] = L"用もないのにGDI+で描画するドキドキ";
Gdiplus::Font font(L"MS ゴシック", 64);
// 描画範囲の矩形
Gdiplus::RectF rect(20.0f, 20.0f,500.0f,500.0f);
// アルファブレンディング値を半分(128)にしているので透過するぞ
Gdiplus::SolidBrush brush(Gdiplus::Color(128, 0, 0, 255));
// 書式整形の情報を指定できるオブジェクトだけど、とりあえずデフォルトで使う
Gdiplus::StringFormat format;
graphics.DrawString(dokidoki,-1,&font,rect,&format,&brush);
}
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// ここにGDI+による描画関数呼び出しを追加してみた
drawByGdiPlus(hdc);
EndPaint(hWnd, &ps);
break;