Подтвердить что ты не робот

Форма С# с пользовательскими границами и закругленными краями

Я использую этот код, чтобы сделать свою форму (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);

Но см. это screenshot.

Внутренний прямоугольник формы не имеет закругленных ребер.

Как я могу заставить синий прямоугольник формы иметь закругленный край, чтобы он не выглядел как скриншот?

4b9b3361

Ответ 1

Власть региона просто отсекает углы. Чтобы иметь нужный округлый угол, вам нужно будет нарисовать округленные прямоугольники.

Рисование закругленных прямоугольников

Возможно, было бы проще нарисовать образ нужной вам формы и поместить ее в прозрачную форму. Легче рисовать, но не может быть изменено.

Ответ 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);
}

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