Некоторые мысли о том, как обрабатывать исключения
Будет ли возвращение null хорошим или плохим дизайном, зависит от исключения и того, где этот фрагмент размещен в вашей системе.
Если Исключением является NullPointerException, вы, вероятно, применяете блок catch несколько навязчиво (как управление потоком данных).
Если это что-то вроде IOException, и вы не можете ничего сделать против причины, вы должны выбросить исключение в контроллер.
Если контроллер является фасадом компонента, он переводит Исключение в хорошо документированный набор возможных исключений для конкретного компонента, которые могут возникнуть на интерфейсе. А для подробной информации вы должны включить оригинальное исключение в качестве вложенного исключения.
Вы можете сделать это, указав 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
метод. Вы можете указать стиль границы, цвет и различные другие свойства. Я также полагаю, он управляет настройкой полей за вас.
Думаю, нет ... но вы можете переместить положение рисования на половину размера пера в правый нижний угол