您的位置:首页 > 编程语言

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

2005-03-25 20:42 369 查看
很偶然的机会发现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之间到底是什么一种关系呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐