Windows グラフィックス デバイス インターフェイス (GDI) と GDI+ 描画操作を同じコード パスに混在させるのが望ましい場合があります。 この記事では、GDI と GDI+ の連携を可能にするコードを記述するのに役立つヒントを提供します。
元の製品バージョン: Windows グラフィックス デバイス インターフェイス
元の KB 番号: 311221
概要
GDI と GDI+ コードを混在させると、特定の規則が適用されます。 たとえば、1 つのターゲット オブジェクトに対して GDI と GDI+ の呼び出しをインターリーブしないでください。 HDC の周囲に Graphics オブジェクトをラップしてもかまいませんが、Graphics オブジェクトが破棄されるまで、GDI から直接 HDC にアクセスしないでください。
この記事では、GDI と GDI+ の間の相互運用性に関する 4 つの主要なシナリオについて説明します。
- 画面がバックになっている GDI+ Graphics オブジェクトで GDI を使用する
- ビットマップでサポートされる GDI+ Graphics オブジェクトでの GDI の使用
- GDI HDC での GDI+ の使用
- GDI メモリ
HBITMAP
での GDI+ の使用 (ビットマップ オブジェクトへのハンドル)
画面がバックになっている GDI+ Graphics オブジェクトで GDI を使用する
画面に裏打ちされた GDI+ Graphics オブジェクトで GDI を使用する必要がある場合の 1 つの例は、ゴムバンドまたはフォーカスの四角形を描画することです。 GDI+ は現在、ラスター操作 (ROP) を直接サポートしていないので、R2_XORペン操作が必要な場合は、GDI を直接使用する必要があります。 この場合は、 Graphics::GetHDC()
を使用して、GDI 出力の転送先となる HDC を取得します。 HDC (つまり、 Graphics::ReleaseHDC()
が呼び出されるまで) の間、Graphics オブジェクトに対して GDI+ 出力を試行しないでください。
ビットマップでサポートされる GDI+ Graphics オブジェクトでの GDI の使用
画面ではなくビットマップによってサポートされる Graphics オブジェクトに対して Graphics::GetHDC()
が呼び出されると、メモリ HDC が作成され、新しい HBITMAP
が作成され、メモリ HDC に選択されます。 この新しいメモリ ビットマップは、元のビットマップのイメージで初期化されるのではなく、SENTINEL パターンを使用して初期化されます。これにより、GDI+ はビットマップへの変更を追跡できます。 GDI コードを使用してメモリ ビットマップに加えられた変更は、Sentinel パターンの変更で明らかになります。
Graphics::ReleaseHDC()
が呼び出されると、それらの変更が元のビットマップにコピーされます。 メモリ ビットマップはビットマップのイメージで初期化されないため、この方法で取得された HDC は 書き込み専用 と見なす必要があるため、ROP での使用には適していません。そのため、これを使用するには、R2_XORのようにターゲットを読み取る機能が必要です。 また、GDI+ は変更を元のビットマップにコピーし直す必要があるため、この方法にはパフォーマンス コストがかかります。
GDI HDC での GDI+ の使用
HDC をパラメーターとして受け取る Graphics コンストラクターを使用することで、HDC での GDI+ の使用を容易にすることができます。 Graphics クラスの描画機能は、この方法で HDC に描画するために使用できます。 グラフィックス オブジェクトが HDC にアタッチされると、Graphics オブジェクトが破棄されるか、スコープ外になるまで、HDC に対して GDI 操作を実行する必要はありません。 HDC で GDI 出力が必要な場合は、元の HDC を使用する前に Graphics オブジェクトを破棄するか、 Graphics::GetHDC()
を使用して新しい HDC を取得し、GDI+ オブジェクトで GDI を使用しているときに相互運用性を得るためにこの記事で前述した規則に従います。
GDI メモリ HBITMAP での GDI+ の使用
パラメーターとして HBITMAP
を受け取る GDI+ Bitmap コンストラクターは、ビットマップのバッキング イメージとして実際のソース HBITMAP
を使用しません。 代わりに、イメージのコピーがコンストラクターで行われ、デストラクターの実行中であっても、変更は元のビットマップに書き戻されません。 新しいビットマップは作成時にコピーと考えることができるため、GDI+ を GDI から HBITMAP
メモリに描画し、変更を HBITMAP
に適用するには、代わりに次のようなアプローチが必要です。
-
DIBSection
を作成します。 - メモリ HDC に
DIBSection
を選択します。 - GDI+ を使用して
DIBSection
に描画するには、HDC の周囲に Graphics オブジェクトをラップします。 - GDI を使用して
DIBSection
との間で描画するには、Graphics オブジェクトを破棄し、HDC を使用します。 - グラフィックス オブジェクトを破棄し、HDC から
DIBSection
選択を解除します。 後で、ビットマップをDIBSection
から構築し、必要に応じてGraphics::DrawImage()
のソース イメージとして使用できます。