Как создать 2 закругленных угла в winforms с границами? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть код, который помог мне сделать закругленный угол без полей WinForm.Он работает нормально, но дело в том, что у него нет границ, поэтому я хочу добавить к нему округленные границы.Кроме того, я хочу, чтобы только углы TopLeft и BottomRight были округлены.

Это мой текущий код:

public partial class mainForm : Form
{
    [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();
    this.FormBorderStyle = FormBorderStyle.None;
    Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20));
}

Это легко достижимо в WPF, но как мне это сделать?получить это в WinForms?

Что мне делать?

1 Ответ

1 голос
/ 15 мая 2019

Вы можете нарисовать границу вручную в клиентской области. Это очень просто, но вы должны позаботиться о том, чтобы расположить дочерние элементы управления с некоторым запасом.

И это все еще проблема, потому что есть только 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);
}

Результат:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...