座標系の種類

Windows GDI+ では、ワールド、ページ、デバイスの 3 つの座標空間が使用されます。 呼び出し myGraphics.DrawLine(&myPen, 0, 0, 160, 80)を行うと、 Graphics::D rawLine メソッド (0, 0) および (160, 80) に渡すポイントがワールド座標空間に配置されます。 GDI+ によって画面上に直線が描画される前に、座標には一連の変換が実行されています。 1 つの変換ではワールド座標がページ座標に変換され、もう 1 つの変換ではページ座標がデバイス座標に変換されます。

たとえば、クライアント領域の左上ではなく、本文を原点とする座標系を使用するとします。 たとえば、クライアント領域の左端から 100 ピクセル、クライアント領域の上端から 50 ピクセルのところを原点にするとします。 次の図は、このような座標系を示しています。

ラベル付きの座標軸を含むウィンドウのスクリーン ショット

myGraphics.DrawLine(&myPen, 0, 0, 160, 80) を呼び出すと、次の図のような直線が得られます。

前のウィンドウのスクリーン ショットが、原点から斜めに延びる青い線

3 つの座標空間における直線の端点の座標は次のとおりです。

Space エンドポイント座標
World (0, 0) から (160, 80)
ページ (100, 50) から (260, 130)
Device (100, 50) から (260, 130)

 

ページ座標空間は、クライアント領域の左上を原点としていることに注意してください。常にこうなります。 また、測定単位はピクセルであるため、デバイス座標とページ座標は同じであることに注意してください。 測定単位をピクセル以外 (インチなど) に設定すると、デバイス座標はページ座標と異なる結果になります。

ワールド座標をページ座標にマップする変換は、 ワールド変換 と呼ばれ、 Graphics オブジェクトによって維持されます。 前の例では、ワールド変換は x 方向に 100 単位、y 方向に 50 単位の変換です。 次の使用例は 、Graphics オブジェクトのワールド変換を設定し、その Graphics オブジェクトを使用して、前の図に示した線を描画します。

myGraphics.TranslateTransform(100.0f, 50.0f);

myGraphics.DrawLine(&myPen, 0, 0, 160, 80);

ページ座標をデバイス座標にマップする変換は、 ページ変換と呼ばれます。 Graphics クラスには、ページ変換を操作および検査するための 4 つのメソッド (Graphics::SetPageUnitGraphics::GetPageUnitGraphics::SetPageScaleGraphics::GetPageScale) が用意されています。 Graphics クラスには、ディスプレイ デバイスの 1 インチあたりの水平方向および垂直方向のドットを調べるための Graphics::GetDpiXGraphics::GetDpiY という 2 つのメソッドも用意されています。

Graphics クラスの Graphics::SetPageUnit メソッドを使用して、測定単位を指定できます。 次の例では、(0, 0) から (2, 1) までの線を描画します。ここで、ポイント (2, 1) は右に 2 インチ、ポイント (0, 0) から 1 インチ下に配置されます。

myGraphics.SetPageUnit(UnitInch);

myGraphics.DrawLine(&myPen, 0, 0, 2, 1);

注意

ペンを作成するときにペンの幅を指定しない場合、前の例では 1 インチ幅の線が描画されます。 Pen コンストラクターには、2 番目の引数で ペン の幅を指定できます。

Pen myPen(Color(255, 0, 0, 0), 1/myGraphics.GetDpiX()).

 

ディスプレイ デバイスが水平方向に 96 ドット/インチ、垂直方向に 96 ドット/インチであると仮定した場合、前の例の線の終点は、3 つの座標空間に次の座標を持ちます。

Space エンドポイント座標
World (0, 0) から (2, 1)
ページ (0, 0) から (2, 1)
Device (0, 0, to (192, 96)

 

ワールド変換とページ変換を組み合わせることで、さまざまな効果を実現できます。 たとえば、測定単位としてインチを使用し、座標系の原点をクライアント領域の左端から 2 インチ、クライアント領域の上端から 1/2 インチにしたいとします。 次の例では、 Graphics オブジェクトのワールド変換とページ変換を設定し、(0, 0) から (2, 1) までの線を描画します。

myGraphics.TranslateTransform(2.0f, 0.5f);
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);

次の図は、直線と座標系を示しています。

前のウィンドウのスクリーン ショットが広く、軸が左に配置され、ラベルが異なる

ディスプレイ デバイスが水平方向に 96 ドット/インチ、垂直方向に 96 ドット/インチであると仮定した場合、前の例の線の終点は、3 つの座標空間に次の座標を持ちます。

Space エンドポイント座標
World (0, 0) から (2, 1)
ページ (2, 0.5) から (4, 1.5)
Device (192, 48) から (384, 144)