2009-09-28 24 views
9

Estoy dibujando un gráfico en un control, pero 0,0 está en la esquina superior izquierda del control. ¿Hay alguna manera de voltear las coordenadas para que 0,0 esté en la esquina inferior izquierda del control?voltear coordenadas al dibujar para controlar

+0

¿Está utilizando Windows Forms o WPF? Es posible que desee actualizar las etiquetas de su pregunta. –

Respuesta

13

Si está utilizando Windows Forms, entonces usted podría encontrar que usted puede voltear el eje Y usando Graphics.ScaleTransform:

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... 
} 

Sólo es necesario incluir el inicio llamadas contenedor/END si usted quiere hacer el dibujo adicional usando el sistema de coordenadas regular también. Más información sobre contenedores gráficos es available on MSDN.

Según lo mencionado por Tom en los comentarios, este enfoque requiere que el valor Height esté disponible con un valor correcto. Si prueba esto y no ve nada, asegúrese de que el valor sea correcto en un depurador.

+0

También debe agregar la traducción para que esto funcione correctamente. – Eric

+0

Gracias Eric. Actualicé mi respuesta e incluí información sobre el uso de contenedores de gráficos para aislar estas transformaciones de otros cambios. –

+0

No funcionó para mí. No soy un wiz WinForms todavía. Como resulta "Altura" no se relaciona con el control actual. Llamé a esto en mi panel. En Pintura y nada se pintó. Mencionar que usted supone que está utilizando el formulario en sí mismo podría ahorrarle tiempo a otros, ya que podría haberme ahorrado tiempo de depuración;) – Tom

0

No, pero utilizando las propiedades Size (o Height) del control, es fácil calcular las coordenadas volteadas: simplemente dibuje a Height-y.

0

No lo sé pero si usa (x, Control.Height-y) obtendrá el mismo efecto.

-1

en definitiva no, sin embargo, si me baso en los controles de un montón tengo unas pocas funciones que me ayudan:

Point GraphFromRaster(Point point) {...} 
Point RasterFromGraph(Point point) {...} 

esta manera guardo toda la conversión en un solo lugar, sin tener que preocuparse por cosas como y - this.Height dispersos por el código.

+0

¿por qué el voto hacia abajo? – Pondidum

1

Aquí hay un control de usuario simple que muestra cómo hacer esto:

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); 
    } 
} 
Cuestiones relacionadas