GDI+托管代码坐标变换矩阵复位问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值