Использование графики для рисования прямоугольника в левом верхнем углу элемента управления WinForms обрезает один пиксель сверху и слева от прямоугольника - PullRequest
1 голос
/ 08 июля 2019

У меня есть проект WinForms, и я пытаюсь нарисовать прямоугольник в точке (0,0), в верхнем левом углу формы. По какой-то причине он обрезает один пиксель высоты и ширины прямоугольника. Вот код:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawRectangle(new Pen(Color.Red, 5), new Rectangle(0, 0, 50, 50));
}

Вот результат, взорванный для наглядности:

enter image description here

Я понимаю, что я мог бы исправить это, нарисовав прямоугольник в (1,1), но это не так, как это должно работать на основе того, что я видел из элементов управления, которые расположены в (0,0) и (1, 1). Например, вот как выглядит панель (1,1), и она явно имеет разрыв в один пиксель:

enter image description here

Итак, мой вопрос: почему рисование прямоугольника в (0,0) не ведет себя как размещение элемента управления в (0,0)? Почему прямоугольник обрезается на один пиксель сверху и слева?

1 Ответ

2 голосов
/ 08 июля 2019

Значение по умолчанию для Alignment свойства Pen равно PenAlignment.Center, что означает, что нарисованная линия будет центрирована по линии. Так что то, что вы видите, ожидается.

Вы можете установить Alignment на PenAlignment.Inset:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.DrawRectangle(
        new Pen(Color.Red, 5) { Alignment = PenAlignment.Inset },
        new Rectangle(0, 0, 50, 50));
}

Вы также можете прочитать Pen.Alignment примечания:

Center является значением по умолчанию для этого свойства и указывает, что Ширина пера центрируется по контуру кривой или многоугольника. значение Inset для этого свойства указывает, что ширина пера находится внутри контура кривой или многоугольника. Три других значения, Right, Left и Outset приведут к центру пера.

...