А почему Inflate делаете в одном случае на половину толщины пера, в другом — на толщину пера?
Попробуйте оба раза сделать так:
recf.Inflate(-gpen.Width, -gpen.Width);
потом, вы из какой гипотезы исходите:
— границы прямоугольника рисуются снаружи указанного прямоугольника,
— внутри,
— половина границы снаружи, половина внутри?
Я склоняюсь ко второму варианту, хотя не проверяла.
Лучше всего нарисовать первый прямоугольник, потом уменьшить размер прямоугольника на толщину пера, потом уже внутри этого прямоугольника рисовать второй прямоугольник:
// получаем ссылку на объект графики
Graphics g = e.Graphics;
// создаем перо для рамки графика
Pen gpen = new Pen(Color.Red, 5);
// рисуем рамку графика
g.DrawRectangle(gpen, recf.X, recf.Y, recf.Width, recf.Height);
// уменьшаем размер прямоугольной клиентской области на толщину пера рамки
recf.Inflate(-gpen.Width, -gpen.Width);
gpen.Width = 1;
gpen.Color = Color.Black;
g.DrawRectangle(gpen, recf.X, recf.Y, recf.Width, recf.Height);
recf.Inflate(-gpen.Width , -gpen.Width );
// рисовать дальше внутри второго прямоугольника