Подтвердить что ты не робот

Граница в DrawRectangle

Ну, я кодирую событие OnPaint для своего собственного контроля, и для меня очень важно сделать его точным.

У меня небольшая проблема с границами прямоугольников.

Смотрите изображение:

удалена мертвая ссылка ImageShack

Эти два прямоугольника были нарисованы с одинаковыми параметрами местоположения и размера, но с использованием другого размера пера. Посмотрите, что случилось? Когда граница стала больше, она съела свободное пространство перед прямоугольником (слева).

Интересно, есть ли какое-то свойство, которое заставляет границу рисоваться внутри прямоугольника, так что расстояние до прямоугольника всегда будет одинаковым. Спасибо.

4b9b3361

Ответ 1

Вы можете сделать это, указав PenAlignment

Pen pen = new Pen(Color.Black, 2);
pen.Alignment = PenAlignment.Inset; //<-- this
g.DrawRectangle(pen, rect);

Ответ 2

Если вы хотите ограничить внешние границы прямоугольника во всех направлениях, вам нужно будет пересчитать его по отношению к ширине пера:

private void DrawRectangle(Graphics g, Rectangle rect, float penWidth)
{
    using (Pen pen = new Pen(SystemColors.ControlDark, penWidth))
    {
        float shrinkAmount = pen.Width / 2;
        g.DrawRectangle(
            pen,
            rect.X + shrinkAmount,   // move half a pen-width to the right
            rect.Y + shrinkAmount,   // move half a pen-width to the down
            rect.Width - penWidth,   // shrink width with one pen-width
            rect.Height - penWidth); // shrink height with one pen-width
    }
}

Ответ 3

Это не прямой ответ на вопрос, но вы можете подумать об использовании метода ControlPaint.DrawBorder. Вы можете указать стиль, цвет и другие свойства границы. Я также считаю, что он обрабатывает корректировки полей для вас.

Ответ 4

Я думаю, что нет... но вы можете переместить позицию рисования на половину размера пера в нижнее правое