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);
}

(добавил бы как комментарий, но репутация оценена)

Другие вопросы по тегам