Обе из технологий имеют свои за и против. В крупном приложении с "классическим" UI я использовал бы Windows Forms. В приложении, которые требуют богатого пользовательского интерфейса (очищение, анимации, изменяя пользовательский интерфейс) я выбрал бы WPF. Проверьте статью WPF по сравнению с Windows Forms , сравнивающими WPF и Windows Forms.
Если вы используете 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 .
Как упоминал Том в комментариях, этот подход требует, чтобы значение Высота
было доступно с правильным значением. Если вы попробуете это и ничего не увидите, убедитесь, что значение в отладчике правильное.
Нет, но используя свойства элемента управления Размер
(или Высота
), легко вычислить перевернутые координаты: просто нарисуйте ] Высота-y
.
Вот простой 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);
}
}
Не знаю, но если вы используете (x, Control.Height-y), вы получите тот же эффект.
короче нет, однако если я много использую элементы управления, у меня есть несколько функций, которые мне помогают:
Point GraphFromRaster(Point point) {...}
Point RasterFromGraph(Point point) {...}
таким образом я сохраняю все преобразования в одном месте, не беспокоясь о вещах like y - this.Height
, разбросанный по коду.