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之间到底是什么一种关系呢?
先看下面这段代码:
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之间到底是什么一种关系呢?
相关文章推荐
- GDI+托管代码坐标变换矩阵复位问题
- GDI+学习及代码总结之-----坐标变换、矩阵变换及色彩变换
- GDI+学习及代码总结之-----坐标变换、矩阵变换及色彩变换
- JAVA代码—算法基础:0-1矩阵的问题
- LeetCode 48. Rotate Image 二维矩阵90度翻转问题,坐标推算,空间利用
- 《对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们》的问题的解决方法
- 矩阵的坐标变换(转)
- 关于开源中国代码托管的一些问题
- 矩阵的坐标变换(转)
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。问题的解决方法!
- [WebGL入门]十三,minMatrix.js和坐标变换矩阵
- 类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们的问题的解决方法 续集
- osc代码托管页面的一点页面问题(属于个人观点)
- git提交到开源中国代码托管问题
- 03 - OpenGL 坐标变换中的各种矩阵
- 一个QGraphicsItem 坐标变换的问题
- cocos2d 关于二叉树的坐标变换问题
- 思考:矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...
- 矩阵及变换,以及矩阵在DirectX和OpenGL中的运用问题:左乘/右乘,行优先/列优先,...
- Nyoj 298 点的变换[利用矩阵求解坐标点的转换,平移,绕原点旋转,沿x,y轴翻转]