Make + y UP, переместить Происхождение C # System.Drawing.Graphics

StackOverflow https://stackoverflow.com/questions/1030295

  •  06-07-2019
  •  | 
  •  

Вопрос

Я хочу, чтобы источник находился в центре моего окна.

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

.NET хочет, чтобы он находился в верхнем левом углу.

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

Точка чистая, и я пытаюсь ладить ..

Кто-нибудь знает, как сделать это в C #, просто используя объект Graphics?

Graphics.TranslateTransform не делает этого, так как оставляет координаты перевернутыми вверх ногами. Комбинирование этого Graphics.ScaleTransform (1, -1) также не является удовлетворительным, поскольку это заставляет текст выглядеть вверх ногами.

Это было полезно?

Решение

Одним из решений будет использование свойства TranslateTransform. Затем вместо использования структур Point / PointF вы можете создать собственные структуры FlippedPoint / FlippedPointF, которые имеют неявное приведение к Point / PointF (но путем их приведения координаты переворачиваются):

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

Другие советы

Вы можете продолжить использовать ScaleTransform (1, -1) и временно сбросить текущее преобразование во время рисования текста:

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

Попробуйте создать графический объект с отрицательной высотой. Я не знаю библиотеки C # специально, но этот прием работает в последних версиях GDI.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top