我在控件上绘制图形,但0,0位于控件的左上角。有没有办法翻转坐标,以便0,0位于控件的左下角?
答案 0 :(得分:16)
如果您使用的是WinForms,那么您可能会发现可以使用Graphics.ScaleTransform翻转Y轴:
private void ScaleTransformFloat(PaintEventArgs e)
{
// Begin graphics container
GraphicsContainer containerState = e.Graphics.BeginContainer();
// Flip the Y-Axis
e.Graphics.ScaleTransform(1.0F, -1.0F);
// Translate the drawing area accordingly
e.Graphics.TranslateTransform(0.0F, -(float)Height);
// Whatever you draw now (using this graphics context) will appear as
// though (0,0) were at the bottom left corner
e.Graphics.DrawRectangle(new Pen(Color.Blue, 3), 50, 0, 100, 40);
// End graphics container
e.Graphics.EndContainer(containerState);
// Other drawing actions here...
}
如果您还想使用常规坐标系进行其他绘图,则只需要包含开始/结束容器调用。有关图形容器的更多信息是available on MSDN。
正如Tom在评论中所提到的,这种方法要求Height
值具有正确的值。如果您尝试此操作并且看不到任何内容,请确保调试器中的值是正确的。
答案 1 :(得分:1)
不,但使用控件的Size
(或Height
)属性,可以轻松计算翻转坐标:只需绘制到Height-y
。
答案 2 :(得分:1)
这是一个简单的UserControl,演示了如何执行此操作:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.ScaleTransform(1.0F, -1.0F);
e.Graphics.TranslateTransform(0.0F, -(float)Height);
e.Graphics.DrawLine(Pens.Black, new Point(0, 0), new Point(Width, Height));
base.OnPaint(e);
}
}
答案 3 :(得分:0)
不是我知道但是如果你使用(x,Control.Height-y)你会得到同样的效果。
答案 4 :(得分:-1)
简而言之,不管怎样,如果我在控件上大量使用,我会有一些功能可以帮助我:
Point GraphFromRaster(Point point) {...}
Point RasterFromGraph(Point point) {...}
通过这种方式,我可以将所有转化保存在一个地方,而不必担心y - this.Height
之类的内容散布在代码中。