C# Форма с пользовательской рамкой и закругленными краями
Я использую этот код, чтобы сделать мою форму (FormBorderStyle=none) с закругленными краями:
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect, // x-coordinate of upper-left corner
int nTopRect, // y-coordinate of upper-left corner
int nRightRect, // x-coordinate of lower-right corner
int nBottomRect, // y-coordinate of lower-right corner
int nWidthEllipse, // height of ellipse
int nHeightEllipse // width of ellipse
);
public Form1()
{
InitializeComponent();
Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20));
}
И это, чтобы установить пользовательскую границу для события Paint:
ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid, Color.Black, 5, ButtonBorderStyle.Solid);
Но посмотри на это ,
Прямоугольник внутренней формы не имеет закругленных краев.
Как сделать так, чтобы синий прямоугольник внутри формы тоже имел закругленный край, чтобы он не выглядел как на скриншоте?
2 ответа
Регион Регион просто отсекает углы. Чтобы иметь действительно закругленный угол, вам нужно нарисовать прямоугольники со скругленными углами.
Рисование прямоугольников со скругленными углами
Может быть проще нарисовать изображение нужной формы и поместить его в прозрачную форму. Легче рисовать, но не может быть изменен.
Обратите внимание, что у вас утечка дескриптора, возвращаемого CreateRoundRectRgn (), вы должны освободить его с помощью DeleteObject() после его использования.
Region.FromHrgn() копирует определение, поэтому не освобождает дескриптор.
[DllImport("Gdi32.dll", EntryPoint = "DeleteObject")]
public static extern bool DeleteObject(IntPtr hObject);
public Form1()
{
InitializeComponent();
IntPtr handle = CreateRoundRectRgn(0, 0, Width, Height, 20, 20);
if (handle == IntPtr.Zero)
; // error with CreateRoundRectRgn
Region = System.Drawing.Region.FromHrgn(handle);
DeleteObject(handle);
}
(добавил бы как комментарий, но репутация оценена)