グラフィックスデバイスインタフェースは、グラフィカルオブジェクトを表現し、プリンタやモニタなどの出力デバイスに転送するために使用されるMicrosoft WindowsのAPIです。GDI は、アプリケーションが画面や印刷物に対して描画命令を発行するときに、ハードウェア固有の差異を吸収して一貫した描画結果を提供する役割を担います。

概要と役割

GDI は主に 2D の描画を担当します。線や曲線、長方形や円のような図形描画、フォントのレンダリング、ビットマップ操作、パレット管理、クリッピング、座標変換(論理座標→デバイス座標)などを行います。ウィンドウやメニューなどのコントロール表示で使われる低レベルの描画基盤として、従来の Windows アプリケーションで広く利用されてきました。

基本概念と主な API

GDI を理解するうえで重要な概念には次のものがあります。

  • デバイスコンテキスト(DC):描画先(ウィンドウ、メモリ、プリンタなど)を表すハンドル。描画属性(ペン、ブラシ、フォントなど)は DC に関連付けて操作します。
  • GDI オブジェクト:ペン(線の色・太さ)、ブラシ(塗りつぶし)、フォント、ビットマップ、リージョン、パレットなど。Create系関数で生成し、SelectObject で DC に選択して使用します。
  • 描画関数:BitBlt、StretchBlt、MoveToEx/LineTo、Rectangle、Ellipse、TextOut、DrawText、ExtTextOut など。ビットブロック転送やテキスト描画、幾何学図形の描画に使います。
  • 座標系とマッピングモード:MM_TEXT や MM_ISOTROPIC など、論理座標系→デバイス座標系の変換を制御できます。これによりデバイスの解像度差や印刷時のスケーリングを吸収します。
  • メタファイル:WMF/EMF(Windows Metafile / Enhanced Metafile)は GDI の描画命令を記録・再生できる形式で、印刷や描画コマンドの保存・再現に便利です。

よく使われる場面・用途

  • 標準的なデスクトップ GUI(ウィンドウのクライアント領域の描画、カスタムコントロール)
  • 印刷(プリンタの解像度に合わせたスケーリングや EMF を使った印刷パイプライン)
  • スクリーンキャプチャやビットマップ操作(BitBlt を用いた画像コピー・合成)
  • 簡単な 2D グラフやチャート、ビジネスアプリケーションの描画
  • .NET 環境では System.Drawing(内部的に GDI+/GDI を利用)による描画

長所

  • デバイス抽象化:スクリーンやプリンタなど複数デバイス間で同じ描画コードが使える。
  • 成熟した API:長年の互換性が保たれており、Windows のほとんどのバージョンで動作する。
  • プリンタ対応:高解像度のプリンティングを意識した API やメタファイルが整備されている。

短所・制約

  • GPU の機能をフルに利用する設計ではないため、3D レンダリングやハードウェアアクセラレーションが必須のアニメーションやゲームには不向きです。現代のゲームや高性能グラフィックスは通常、DirectXやOpenGLを使います。
  • ダブルバッファリングやフレームバッファ同期の概念が低レベルにないため、滑らかな高速アニメーションや垂直同期を扱いにくい場合があります。
  • GDI オブジェクト(ペンやブラシ等)は有限で、リークするとリソース不足に陥る。CreateObject したら必ず DeleteObject する必要があります。
  • スレッド周りの注意:DC やウィンドウに対する描画は通常 UI スレッド(WM_PAINT 処理内)で行うのが安全です。背景での直接描画は競合や更新漏れを招くことがあります。

GDI とその後継・周辺技術

GDI の上位互換や代替としては以下があります。

  • GDI+:GDI を拡張した API。よりリッチな 2D 機能(アルファ合成、グラデーション、拡張テキスト処理)を提供し、.NET の System.Drawing などで使われます。ただし GDI+ も最新 GPU を直接制御するものではありません。
  • Direct2D / DirectWrite:ハードウェアアクセラレーションを活用した 2D 描画と高品質なテキスト描画を提供するモダンな API。高パフォーマンス・高品質を必要とするアプリで推奨されます。
  • WPF(Windows Presentation Foundation):ベクトルベースでリッチな UI を構築でき、必要に応じて DirectX を利用します。ハードウェアアクセラレーションに適しています。
  • OpenGL / DirectX:主に 3D レンダリング向けですが、2D でも高性能描画に利用されます。ゲームや多数の動的オブジェクトを扱うアプリで一般的です。

実践上の注意点

  • WM_PAINT ハンドラ内では BeginPaint/EndPaint を使い、必要な領域のみ更新する。
  • バックバッファ(メモリ DC)を用いたダブルバッファリングでチラツキを抑える。BitBlt/StretchBlt が有用。
  • GDI オブジェクトは使用後に適切に解放する(SelectObject 後は元のオブジェクトに戻して DeleteObject)。GDI ハンドルのリークはパフォーマンス低下や描画破綻につながる。
  • 高解像度ディスプレイ(DPI)の対応:論理座標と物理ピクセルの違いを理解し、GetDeviceCaps やマッピングモードを利用して DPI に依存しない描画を行う。
  • 複雑で高性能が求められる描画は、Direct2D や Direct3D、WPF などへの移行を検討する。

まとめると、GDI は Windows の伝統的な 2D 描画基盤であり、プリンタやスクリーン向けのデバイス抽象化や基本的な図形/テキスト描画に強みがあります。一方で、現代のハードウェアを活用した高性能・高品質な描画が必要な場面では、DirectXやOpenGLをはじめとするより新しい技術や、Direct2D/WPF のようなモダンなレンダリング技術を選択することが一般的です。また、GDI を扱う際はリソース管理(GDI オブジェクトの解放)やスレッド/描画タイミングの管理に注意してください。