зеркально отразите координаты при рисовании для управления

Обе из технологий имеют свои за и против. В крупном приложении с "классическим" UI я использовал бы Windows Forms. В приложении, которые требуют богатого пользовательского интерфейса (очищение, анимации, изменяя пользовательский интерфейс) я выбрал бы WPF. Проверьте статью WPF по сравнению с Windows Forms , сравнивающими WPF и Windows Forms.

10
задан Nippysaurus 28 September 2009 в 08:41
поделиться

5 ответов

Если вы используете WinForms, вы можете обнаружить, что вы можете перевернуть ось Y, используя 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...
}

Вам нужно только включить начало / end вызовы контейнера, если вы хотите сделать дополнительное рисование, используя обычную систему координат. Дополнительная информация о графических контейнерах доступна в MSDN .

Как упоминал Том в комментариях, этот подход требует, чтобы значение Высота было доступно с правильным значением. Если вы попробуете это и ничего не увидите, убедитесь, что значение в отладчике правильное.

16
ответ дан 3 December 2019 в 21:22
поделиться

Нет, но используя свойства элемента управления Размер (или Высота ), легко вычислить перевернутые координаты: просто нарисуйте ] Высота-y .

1
ответ дан 3 December 2019 в 21:22
поделиться

Вот простой 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);
    }
}
1
ответ дан 3 December 2019 в 21:22
поделиться

Не знаю, но если вы используете (x, Control.Height-y), вы получите тот же эффект.

0
ответ дан 3 December 2019 в 21:22
поделиться

короче нет, однако если я много использую элементы управления, у меня есть несколько функций, которые мне помогают:

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

таким образом я сохраняю все преобразования в одном месте, не беспокоясь о вещах like y - this.Height , разбросанный по коду.

-1
ответ дан 3 December 2019 в 21:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: