很偶然的機會發現Graphics對象Transform屬性存在一個百思不得其解的問題,聽朋友說PictureBox的Image屬性也存在類似的問題。
先看下面這段代碼:
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Matrix matrix = new Matrix(1,0,0,-1,0,0);
matrix.Translate(ClientRectangle.Width/2,-ClientRectangle.Height/2);
e.Graphics.Transform = matrix;
e.Graphics.Transform.Reset(); //<<<<<--------------------------------------注意
Rectangle destRect = new Rectangle(10,10,50,50);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128,0,0,0)),destRect);//灰色矩形
matrix.Reset();
e.Graphics.Transform = matrix; //也可以直接使用e.Graphics.ResetTransform();
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(128,255,0,0)),destRect);//紅色矩形
}
運作結果如圖

這說明Graphics.Transform.Reset()根本沒有起作用。按理說,Transform是Graphics的一個屬性,其類型為Matrix,是以在Transform中就應該有一個私有變量存儲Transform的實際值,這樣應該具有如下代碼類似的定義:
internal class MyGraphics
{
private MyMatrix varTransform;
public MyMatrix myTransform
{
get
{
return varTransform;
}
set
{
if(varp!=value)
varTransform=value;
}
}
}
internal class MyMatrix
{
public int i=10;
public void Reset()
{
i=13;
}
}
我用如下代碼測試:
private void button1_Click(object sender, System.EventArgs e)
{
MyGraphics g=new MyGraphics();
MyMatrix matrix=new MyMatrix();
g.myTransform=matrix;
Debug.Write(g.myTransform.i);
g.myTransform.Reset();
Debug.Write(g.myTransform.i);
}
結果表明Reset是能夠修改MyGraphics的私有變量varTransform,那麼Graphics和Transform之間到底是什麼一種關系呢?