天天看點

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);//紅色矩形

  }

運作結果如圖

GDI+托管代碼坐标變換矩陣複位問題

這說明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之間到底是什麼一種關系呢?

繼續閱讀