共用方式為


全域和區域轉換

全域轉換會套用至特定 Graphics 物件繪製的所有項目。 相對地,區域轉換只套用至要繪製的特定項目。

全域轉換

如果要建立全域轉換,請建構 Graphics 物件,然後管理其 Transform 屬性。 Transform 屬性是一個 Matrix 物件,因此它可以存放仿射轉換的任何序列。 儲存在 Transform 屬性的轉換又稱為全局轉換。 Graphics 類別提供幾個方法,用來建置複合的全局轉換:MultiplyTransformRotateTransformScaleTransformTranslateTransform。 下列範例會繪製兩次橢圓形:一次是在建立全局轉換之前,一次是在建立之後。 轉換會先在 Y 方向縮放 0.5 個係數,然後在 X 方向轉換 50 個單位,然後再旋轉 30 度。

        myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)
        myGraphics.ScaleTransform(1, 0.5F)
        myGraphics.TranslateTransform(50, 0, MatrixOrder.Append)
        myGraphics.RotateTransform(30, MatrixOrder.Append)
        myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);

下圖將顯示轉換所使用的矩陣。

轉換

注意事項注意事項

在上述範例中,橢圓形會繞著座標系統的原點旋轉,該原點位於工作區 (Client Area) 的左上角。 這項作業產生的結果和在橢圓形中心點旋轉並不相同。

區域轉換

區域轉換會套用至要繪製的特定項目。 例如,GraphicsPath 物件的 Transform 方法可用來轉換該路徑的資料點 (Data Point)。 下列範例繪製未轉換的矩形和經過旋轉和轉換的路徑 (假設沒有全局轉換)。

        Dim myMatrix As New Matrix()
        myMatrix.Rotate(45)
        myGraphicsPath.Transform(myMatrix)
        myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
        myGraphics.DrawPath(myPen, myGraphicsPath)

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);

您可以結合全局轉換和區域轉換來達到各種效果。 例如,您可以使用全局轉換來修訂座標系統,並可使用區域轉換來旋轉和縮放新座標系統所繪製的物件。

假設您想要使用一個座標系統,其原點距離工作區左邊緣 200 像素和工作區頂端 150 像素處。 此外,假設您想使用像素做為度量單位,其 x 軸指向右方,且其 y 軸指向上方。 預設座標系統的 y 軸指向下方,因此您必須在水平軸執行反射。 下圖將顯示此類反射的矩陣。

轉換

接下來,假設您必須執行右方 200 單位和下方 150 單位的轉換。

下列範例會建立上述說明的座標系統,使用的方法是設定 Graphics 物件的全局轉換。

        Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
        myGraphics.Transform = myMatrix
        myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);

下列程式碼 (位於上述範例的結束處) 建立單一矩形組成的路徑,其中該矩形的左上角位於新座標系統的原點。 該矩形將填入色彩兩次,其中一次並未使用區域轉換,另外一次則使用區域轉換。 區域轉換包括水平縮放 2 個係數,隨後進行 30 度的旋轉。

        ' Create the path.
        Dim myGraphicsPath As New GraphicsPath()
        Dim myRectangle As New Rectangle(0, 0, 60, 60)
        myGraphicsPath.AddRectangle(myRectangle)

        ' Fill the path on the new coordinate system.
        ' No local transformation
        myGraphics.FillPath(mySolidBrush1, myGraphicsPath)

        ' Set the local transformation of the GraphicsPath object.
        Dim myPathMatrix As New Matrix()
        myPathMatrix.Scale(2, 1)
        myPathMatrix.Rotate(30, MatrixOrder.Append)
        myGraphicsPath.Transform(myPathMatrix)

        ' Fill the transformed path on the new coordinate system.
        myGraphics.FillPath(mySolidBrush2, myGraphicsPath)

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath);

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);

下圖將顯示新的座標系統和兩個矩形。

轉換

請參閱

其他資源

座標系統和轉換

使用 Managed GDI+ 中的轉換