很偶然的机会发现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之间到底是什么一种关系呢?