2004年08月29日
川俣晶の縁側ソフトウェア技術雑記total 22291 count

生APIレベルでのGDI+初体験・用もないのにGDI+を使ってみるドキドキ (C++ソース付き)

Written By: 川俣 晶連絡先

 Windowsの技術資料を見ていると、しばしばGDI+という名前が出てきます。

 GDI、特に16bitのGDIなら、かなり良く分かるつもりですが、GDI+は全く使う機会が無く、概要すらもよく把握できていませんでした。

 というわけで、一度、GDI+を使っておきたいと思っていました。もちろん、.NET FrameworkでWindowsアプリケーションを書けば自動的に使用されるらしいのですが、それでは意味がありません。生のGDI+を直接使う、C++の生APIの世界でなければなりません。

 と言うわけで書いてみました。

 GDI+を使用して、JPEG画像の描画、線の描画、文字列の描画を行います。プログラム本体は、MFCもATLも使わない、ほとんどgenericという内容です。WM_PAINTの処理のみ、GDI+を利用して行います。

 (いや、今時のプログラマにはgenericは既に通じないのではないかという悪い予感もしますが、Visual Studio.NETでWin32アプリの初期状態で生成されるものと思えば良いでしょう。実際、それにGDI+による描画コードを書き足していますし)

ソース一式

実行結果 §

 実行結果はこんな感じです。

GDI+で描画GDI+で描画 [300x209] [600x419] [750x524] [768x537]

 素晴らしいですね。

 まず、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;

 ちなみに、このほかに、プログラムの最初と最後にGDI+のセットアップとシャットダウンのコードが必要 (上記ソース一式に含まれるコード参照)。

Facebook

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20040829020020
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.