Вы можете нарисовать границу вручную в клиентской области. Это очень просто, но вы должны позаботиться о том, чтобы расположить дочерние элементы управления с некоторым запасом.
И это все еще проблема, потому что есть только Graphics.FillRegion и нет способа нарисовать контур или DrawRegion
метод.
Мы можем создать GraphicsPath
и нарисовать его с помощью Graphics.DrawPath
, но создать его сложно, например. эта реализация не соответствует созданной с помощью CreateRoundRectRgn()
метода.
Таким образом, есть трюк с 2 регионами: больший регион с цветом границы и меньший регион внутри с цветом клиента. Это оставит немного внешней области, которая визуально создаст границу.
readonly Region _client;
public Form1()
{
InitializeComponent();
// calculate smaller inner region using same method
_client = Region.FromHrgn(CreateRoundRectRgn(1, 1, Width - 1, Height - 1, 20, 20));
Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20));
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// FillRectangle is faster than FillRegion for drawing outer bigger region
// and it's actually not needed, you can simply set form BackColor to wanted border color
// e.Graphics.FillRectangle(Brushes.Red, ClientRectangle);
e.Graphics.FillRegion(Brushes.White, _client);
}
Результат:
![](https://i.stack.imgur.com/vmBBs.png)