Ответ 1
Вы можете сделать это, указав PenAlignment
Pen pen = new Pen(Color.Black, 2);
pen.Alignment = PenAlignment.Inset; //<-- this
g.DrawRectangle(pen, rect);
Ну, я кодирую событие OnPaint для своего собственного контроля, и для меня очень важно сделать его точным.
У меня небольшая проблема с границами прямоугольников.
Смотрите изображение:
удалена мертвая ссылка ImageShack
Эти два прямоугольника были нарисованы с одинаковыми параметрами местоположения и размера, но с использованием другого размера пера. Посмотрите, что случилось? Когда граница стала больше, она съела свободное пространство перед прямоугольником (слева).
Интересно, есть ли какое-то свойство, которое заставляет границу рисоваться внутри прямоугольника, так что расстояние до прямоугольника всегда будет одинаковым. Спасибо.
Вы можете сделать это, указав PenAlignment
Pen pen = new Pen(Color.Black, 2);
pen.Alignment = PenAlignment.Inset; //<-- this
g.DrawRectangle(pen, rect);
Если вы хотите ограничить внешние границы прямоугольника во всех направлениях, вам нужно будет пересчитать его по отношению к ширине пера:
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
}
}
Это не прямой ответ на вопрос, но вы можете подумать об использовании метода ControlPaint.DrawBorder
. Вы можете указать стиль, цвет и другие свойства границы. Я также считаю, что он обрабатывает корректировки полей для вас.
Я думаю, что нет... но вы можете переместить позицию рисования на половину размера пера в нижнее правое