座標系統類型
Windows GDI+ 使用三個座標空間:世界、頁面和裝置。 當您進行呼叫 myGraphics.DrawLine(&myPen, 0, 0, 160, 80)
時,您傳遞至 Graphics::D rawLine 方法的點, (0、0) 和 (160、80) 都位於全局座標空間中。 在 GDI+ 可以在畫面上繪製線條之前,座標會通過一連串的轉換。 一個轉換會將全局座標轉換成頁面座標,另一個轉換會將頁面座標轉換成裝置座標。
假設您想要使用在工作區主體中具有其原點的座標系統,而不是左上角。 例如,例如,您希望原點從工作區左邊緣 100 圖元,以及從工作區頂端 50 圖元。 下圖顯示這類座標系統。
當您進行呼叫 myGraphics.DrawLine(&myPen, 0, 0, 160, 80)
時,您會取得下圖所示的行。
三個座標空間中線條端點的座標如下所示:
Space | 端點座標 |
---|---|
World | (0, 0) 至 (160, 80) |
頁面 | (100、50) 至 (260、130) |
裝置 | (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類別提供四種方法來操作和檢查頁面轉換:Graphics::SetPageUnit、Graphics::GetPageUnit、Graphics::SetPageScale和Graphics::GetPageScale。 Graphics類別也提供兩種方法:Graphics::GetDpiX和Graphics::GetDpiY,以檢查顯示裝置的水準和垂直點。
您可以使用Graphics類別的Graphics::SetPageUnit方法來指定測量單位。 下列範例會從 (0、0) 到 (2、1) 繪製線條,其中點 (2、1) 從 0、0) 點 (向下 2 英吋。
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);
注意
如果您在建構手寫筆時未指定畫筆寬度,則上一個範例會繪製寬一英吋的線條。 您可以將第二個引數中的畫筆寬度指定為 Pen 建構函式:
Pen myPen(Color(255, 0, 0, 0), 1/myGraphics.GetDpiX())
.
如果我們假設顯示裝置的水準方向有 96 個點,而垂直方向為每英吋 96 個點,則上一個範例中的線條端點在三個座標空間中有下列座標:
Space | 端點座標 |
---|---|
World | (0,0) 至 (2,1) |
頁面 | (0,0) 至 (2,1) |
裝置 | (0、 0 到 (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 個點,則上一個範例中的線條端點在三個座標空間中有下列座標:
Space | 端點座標 |
---|---|
World | (0,0) 至 (2,1) |
頁面 | (2、0.5) 至 (4、1.5) |
裝置 | (192、48) 至 (384、144) |