2009-06-23 12 views
5

Quiero que el origen esté en el centro de mi ventana.Make + y UP, Move Origin C# System.Drawing.Graphics

 

______________ 
| ^ | 
|  |  | 
|  o----->| 
|   | 
|____________| 

.NET que quiere que esté en la esquina superior izquierda.

 

_____________> 
|   | 
|   | 
|   | 
|   | 
V____________| 

Dot Net y yo estamos tratando de llevarse bien ..

¿Alguien sabe cómo hacer esto en C# simplemente utilizando el objeto Graphics?

Graphics.TranslateTransform no lo hace porque deja las coordenadas al revés. La combinación de Graphics.ScaleTransform (1, -1) tampoco es satisfactoria, ya que hace que el texto aparezca al revés.

Respuesta

1

Una solución sería utilizar la propiedad TranslateTransform. Entonces, en lugar de utilizar las estructuras Point/PointF se podría crear una FlippedPoint/FlippedPointF estructuras de su propia que tienen conversiones implícitas a Punto/PointF (pero arrojándolos las coordenadas obtener volteado):

public struct FlippedPoint 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public FlippedPoint(int x, int y) : this() 
    { X = x; Y = y; } 

    public static implicit operator Point(FlippedPoint point) 
    { return new Point(-point.X, -point.Y); } 

    public static implicit operator FlippedPoint(Point point) 
    { return new FlippedPoint(-point.X, -point.Y); } 
} 
0

Intente crear el objeto de gráficos con una altura negativa. No conozco la biblioteca C# específicamente, pero este truco funciona en versiones recientes de GDI.

1

Puede seguir usando ScaleTransform(1, -1) y restablece la transformación actual temporalmente mientras dibuja su texto:

// Convert the text alignment point (x, y) to pixel coordinates 
PointF[] pt = new PointF[] { new PointF(x, y) }; 
graphics.TransformPoints(CoordinateSpace.Device, CoordinateSpace.World, pt); 

// Revert transformation to identity while drawing text 
Matrix oldMatrix = graphics.Transform; 
graphics.ResetTransform(); 

// Draw in pixel coordinates 
graphics.DrawString(text, font, brush, pt[0]); 

// Restore old transformation 
graphics.Transform = oldMatrix;