GDI+概要

4373 ワード

Windows GDI+は、Windows XPまたはWindows Server 2003のオペレーティングシステムの画面情報の表示と印刷操作を担当するサブシステムである.GDI+はC++クラスパッケージを採用したAPIのセットである.
GDI+は3つの部分に分けられます.
<1>2-D vector graphics(2 Dベクトルグラフィック)は、主に線、曲線、グラフなどの基本的なグラフィックを描くことに関する.基本的なグラフィックは、画面座標に一連の点を通過することによって構成される.
<2>Imaging(ピクチャ)ベクトルを使用した描画が困難な場合があるので、GDI+のクラスによっては、ビットマップとして記憶されたピクチャを描画するために使用される場合があります
<3>フォント、フォントは主にこのように様々なサイズ、スタイルを表示するフォントに注目しています.
GDI+クラスベースインタフェースの構造
Windows GDI+はC++クラスのインタフェースに基づいており、約40クラス、50列挙、6構造を含む.クラスに属していない関数もあります.
GDI+関数を使用する場合は、名前空間を指定する必要があります:Gdiplus;  
using namespace Gdiplus;

クラスに属さない関数です.2つは次のとおりです.
Status GdiplusStartup( __out ULONG_PTR token *token, __in const GdiplugsStartupInput *input, __out GdiplusStartupOutput *output);

void GdiplusShutdown(__in ULONG_PTR token);

GdiplusStartup()関数は、任意のGDI+関数が呼び出される前に呼び出され、GDI+が切れた後はGdiplusShutdown()関数を呼び出さなければなりません.
GDI+の新機能:
GDI+とGDIの相違点は2つの側面に現れている. 
一、GDI+は、gradient brushes(グラデーションブラシ)やalpha blending(alpha混合、透明度)などの新しい機能を提供することによってGDIを拡張する.
二、GDI+はグラフィックプログラミングモデルをより容易かつ柔軟にする.
新機能の例:
    1. Gradient Brushes(グラデーションブラシ)、GDI+は、閉じた形状、パス、領域を埋めるための線形グラデーションとパスグラデーションブラシを提供します.
    2. Cardinal Splinesは、いくつかの列の個別の曲線から大きな曲線に結合されています.
    3. Independent Path Objectsは、GDIでは、1つのパスがデバイス環境に属し、パスが描かれた後、パスも破棄されます.GDI+では、Graphicsオブジェクトから分離された複数のGraphicsPathオブジェクトを作成および維持できます.一方、GraphicsPathが描画されると破棄されないため、同じGraphicsPathオブジェクトを複数回使用できます.
    4. Transformations and the matrix object、変換およびマトリクスオブジェクト.GDI+はMatrixオブジェクトを提供し、変換(回転、変換など)に強力なツールです.
    5. Scalable Regions,GDI+はGDIがサポートするregionを大きく拡張した.GDIではregionがデバイス座標に格納され,唯一使えるtransformationがtranslationである.GDI+はregionを世界座標系に格納し、regionがMatrixに格納できる任意のtransformationを行うことを許可します.スケール、回転、translateなどです.
    5. Alpha Blending,alpha blendingでは、色を塗りつぶす透明度を指定できます.透明な色はバックグラウンドカラーとブレンドされ、透明度が高いほどバックグラウンドカラーが強調されます.
    6. Support for multiple Image Formatは、複数の画像フォーマットをサポートしています.GDI+は、Image、Bitmap、Metafileクラスを提供し、複数のフォーマットのピクチャをロード、保存、操作することができます.以下のピクチャフォーマットがサポートされています.
    BMP,   GIF , JPEG , Exif ,  PNG ,  TIFF , ICON , WMF , EMF .
GDI+とGDIプログラミングモデルの違い
    Device Contexts , Handles ,  Graphics Objects
GDI+とGDIプログラミングモデルの違いの一態様はDeviceContextハンドルにある.GDI+プログラミングを使用する場合、デバイスContextに注目する必要はありません.ここでいうGDI+プログラミングはDeviceContextに注目する必要はなく,GDIに対してのみである.実際の意味では、GDI+のすべての描画関数はDevice Contextハンドルを渡す必要はなく、他の面ではGDIと同じである.例えば、描画前にDevice Contextを取得しなければならない.GDIは取得したDevice Contextハンドルを呼び出すGDIに関連するすべての関数に渡すが、GDI+は取得したDevice Contextを利用してGraphicxオブジェクトを初期化するだけで、他のGDI+に関連する関数は、デバイスContextハンドルを渡す必要はありません.(GDIのすべての図形描画関数はDeviceContextハンドルをパラメータとして図形描画関数に渡す必要があるため)
Graphicsオブジェクト:GraphicsオブジェクトはDeviceContextと似ています.このオブジェクトには、画面にオブジェクトがどのように描画されるかというさまざまなプロパティが含まれています.(Graphicsはオブジェクト向けの方法でDeviceContextをカプセル化しています).また、描画の方法は基本的にGraphicsオブジェクトから提供されています.
Graphicsオブジェクトはpen,brush,path,imageなどから分離される.GDIではpen,brush,pathなどがselectObjectによってデバイスContextに登録されているという意味です.GDI+ではpen,brush,path,imageなどが描画関数に渡される.
リロード方法
多くのGDI+メソッドがリロードされています.たとえば、DrawLineメソッド:
    
Status DrawLine(const Pen* pen, REAL x1, REAL y1, REAL x2, REAL y2);

Status DrawLine(const Pen* pen, const PointF& pt1, const PointF& pt2);

Status DrawLine(const Pen* pen, INT x1, INT y1, INT x2, INT y2);

Status DrawLine(const Pen* pen, const Point& pt1, Point& pt2);

図面と塗りつぶしの方法は分けられています
GDIで長方形を描画し、長方形の内側領域を塗りつぶすと、長方形の輪郭と長方形の内側領域を塗りつぶすステップが完了します.その輪郭は現在のselectObjectがデバイスContextに入るブラシであり、領域充填は現在デバイスContextに選択されているブラシである.次のようになります.
hBrush = CreateHatchBrush(HS_CROSS, RGB(0,0,255));
hPen = CreatePen(PS_SOLID, 3, RGB(255,0,0));
SelectObject(hdc,hBrush);
SelectObject(hdc,hPen);
Rectangle(hdc, 100, 50, 200, 80);

GDI+では、輪郭の描画と塗りつぶしは別々に行われます.
HatchBrush *myHatchBrush = new HatchBrush(HatchStyleCross, Color(255,0,255,0),Color(255,0,0,255));
Pen *myPen = new Pen(Color(255,255,0,0), 3);
myGraphics.FillRectangle(myHatchBrush, 100, 50, 100, 30);
myGraphics.DrawRectangle(myPen, 100, 50, 100, 30);

ゾーンの構築
GDIでは、CreateRectRgn、CreateRoundRectRgn、CreateEllpticRgn、CreatePolygonRgn、CreatePolygonRgnなどの領域を作成するための多くの関数が提供されています.
GDI+にはRegionクラスが用意されており、1つのRectオブジェクト参照を受け入れるコンストラクション関数と、1つのGraphicsPathオブジェクトポインタを受け入れるコンストラクション関数の2つのコンストラクション関数が提供されています.