GDI+ では、ワールド、ページ、デバイスの 3 つの座標空間が使用されます。 ワールド座標は、特定のグラフィック ワールドをモデル化するために使用される座標であり、.NET Framework のメソッドに渡す座標です。 ページ座標は、フォームやコントロールなど、描画サーフェスで使用される座標系を参照します。 デバイス座標は、画面や用紙など、描画される物理デバイスで使用される座標です。 呼び出しを myGraphics.DrawLine(myPen, 0, 0, 160, 80)すると、DrawLine メソッドに渡すポイント ((0, 0) と (160, 80)) がワールド座標空間に配置されます。 GDI+ が画面に線を描画する前に、座標は一連の変換を通過します。 ワールド変換と呼ばれる変換の 1 つはワールド座標をページ座標に変換し、もう 1 つの変換はページ変換と呼ばれ、ページ座標をデバイス座標に変換します。
変換と座標系
左上隅ではなく、クライアント領域の本体に原点がある座標系を操作するとします。 たとえば、原点をクライアント領域の左端から 100 ピクセル、クライアント領域の上端から 50 ピクセルにする場合などです。 次の図は、このような座標系を示しています。
呼び出しを myGraphics.DrawLine(myPen, 0, 0, 160, 80)すると、次の図に示す行が表示されます。
3 つの座標空間内の線の端点の座標は次のとおりです。
| 座標空間 | エンドポイント座標 |
|---|---|
| 世界 | (0, 0) ~ (160, 80) |
| ページ | (100, 50) ~ (260, 130) |
| デバイス | (100, 50) ~ (260, 130) |
ページ座標空間は、クライアント領域の左上隅に原点があることに注意してください。これは常に当てはまるでしょう。 また、測定単位はピクセルであるため、デバイス座標はページ座標と同じであることにも注意してください。 測定単位をピクセル (インチなど) 以外に設定した場合、デバイスの座標はページ座標とは異なります。
ワールド座標をページ座標にマップするワールド変換は、Transform クラスの Graphics プロパティに保持されます。 前の例では、ワールド変換は x 方向に 100 単位、y 方向に 50 単位の移動です。 次の例では、Graphics オブジェクトのワールド変換を設定し、その Graphics オブジェクトを使用して、前の図に示した線を描画します。
myGraphics.TranslateTransform(100, 50);
myGraphics.DrawLine(myPen, 0, 0, 160, 80);
myGraphics.TranslateTransform(100, 50)
myGraphics.DrawLine(myPen, 0, 0, 160, 80)
ページ変換は、ページ座標をデバイス座標にマップします。 Graphics クラスは、ページ変換を操作するための PageUnit プロパティと PageScale プロパティを提供します。 Graphics クラスには、ディスプレイ デバイスの 1 インチあたりの水平方向および垂直方向のドットを調べるための 2 つの読み取り専用プロパティ (DpiX と DpiY) も用意されています。
PageUnit クラスの Graphics プロパティを使用して、ピクセル以外の測定単位を指定できます。
次の例では、(0, 0) から (2, 1) までの線を描画します。ここで、ポイント (2, 1) は右に 2 インチ、ポイント (0, 0) から 1 インチ下に配置されます。
myGraphics.PageUnit = GraphicsUnit.Inch;
myGraphics.DrawLine(myPen, 0, 0, 2, 1);
myGraphics.PageUnit = GraphicsUnit.Inch
myGraphics.DrawLine(myPen, 0, 0, 2, 1)
注
ペンを作成するときにペンの幅を指定しない場合、前の例では 1 インチ幅の線が描画されます。 2 番目の引数で、Pen コンストラクターにペンの幅を指定できます。
Pen myPen = new Pen(Color.Black, 1 / myGraphics.DpiX);
Dim myPen As New Pen(Color.Black, 1 / myGraphics.DpiX)
ディスプレイ デバイスが水平方向に 96 ドット/インチ、垂直方向に 96 ドット/インチであると仮定した場合、前の例の線の終点は、3 つの座標空間に次の座標を持っています。
| 座標空間 | エンドポイント座標 |
|---|---|
| 世界 | (0, 0) ~ (2, 1) |
| ページ | (0, 0) ~ (2, 1) |
| デバイス | (0, 0) ~ (192, 96) |
ワールド座標空間の原点はクライアント領域の左上隅にあるため、ページ座標はワールド座標と同じであることに注意してください。
ワールド変換とページ変換を組み合わせて、さまざまな効果を実現できます。 たとえば、測定単位としてインチを使用し、座標系の原点をクライアント領域の左端から 2 インチ、クライアント領域の上端から 1/2 インチにする場合を考えます。 次の例では、Graphics オブジェクトのワールド変換とページ変換を設定し、(0, 0) から (2, 1) までの線を描画します。
myGraphics.TranslateTransform(2, 0.5f);
myGraphics.PageUnit = GraphicsUnit.Inch;
myGraphics.DrawLine(myPen, 0, 0, 2, 1);
myGraphics.TranslateTransform(2, 0.5F)
myGraphics.PageUnit = GraphicsUnit.Inch
myGraphics.DrawLine(myPen, 0, 0, 2, 1)
次の図は、線と座標系を示しています。
ディスプレイ デバイスが水平方向に 96 ドット/インチ、垂直方向に 96 ドット/インチであると仮定した場合、前の例の線の終点は、3 つの座標空間に次の座標を持っています。
| 座標空間 | エンドポイント座標 |
|---|---|
| 世界 | (0, 0) ~ (2, 1) |
| ページ | (2,0.5) ~ (4, 1.5) |
| デバイス | (192,48) ~ (384, 144) |
こちらも参照ください
.NET Desktop feedback