2009-06-23 7 views
5

Ich möchte, dass der Ursprung in der Mitte meines Fensters ist.Make + y UP, Origin verschieben C# System.Drawing.Graphics

 

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

.NET will es in der linken oberen Ecke sein.

 

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

Dot net und ich versuchen, miteinander auszukommen ..

Wer weiß, wie diese mit in C# zu tun, nur das Graphics-Objekt?

Graphics.TranslateTransform tut es nicht, da es die Koordinaten umgedreht verlässt. Die Kombination dieser Graphics.ScaleTransform (1, -1) ist ebenfalls nicht zufriedenstellend, da der Text dadurch auf den Kopf gestellt wird.

Antwort

1

Eine Lösung wäre, die TranslateTransform-Eigenschaft zu verwenden. Dann wird anstelle der Punkt/PointF structs verwenden könnten Sie eine FlippedPoint/FlippedPointF structs Ihrer eigenen erstellen, die implizite Abgüsse haben/PointF-zu-Punkt (aber von ihnen die coords gespiegelt bekommen Gießen):

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

Versuchen Sie, das Grafikobjekt mit einer negativen Höhe zu erstellen. Ich kenne die C# -Bibliothek nicht speziell, aber dieser Trick funktioniert in neueren Versionen von GDI.

1

Sie können weiterhin Verwenden Sie ScaleTransform(1, -1) und setzen Sie die aktuelle Umwandlung vorübergehend zurück, während Sie Ihren Text zeichnen:

// 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;