Дизайн формы через свойство Region в winform удаляется - PullRequest
0 голосов
/ 11 марта 2019

Я настроил winform-design, используя свойство region следующим образом,

Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, varPassedInConstructor * 9, Height, 10, 10));

А вот вызов winform через следующий код в новом потоке

new Thread(new ThreadStart(() => {
            toast toast = new toast(message);
            toast.Show(nativeWindow);
            toast.Refresh();

            Thread.Sleep(3000);

            while (toast.Opacity > 0)
            {
                toast.Opacity -= 0.04;
                Thread.Sleep(100);
            }

            toast.Close();
            toast.Dispose();
        })).Start();

Все идет хорошо, форма изначально отображается правильно, но перед внезапным закрытием изменения, примененные с помощью Region , исчезают, и форма выглядит как та, что находится во время разработки.

Изображение одно, когда изначально отображается форма, enter image description here

Изображение два, как раз перед закрытием формы, enter image description here

Я много пробовал, я не понимаю, в чем именно проблема, поэтому вся помощь будет оценена.

1 Ответ

0 голосов
/ 13 марта 2019

Наконец, я получил исправление, вместо использования CreateRoundRectRgn из GDI32 использовался подход GraphicsPath следующим образом:

private void SetRegion()
{
    var GP = RoundedRect(this.ClientRectangle, 5);
    this.Region = new Region(GP);
}

А вот код для функции RoundRect (Кредит переходит на https://stackoverflow.com/a/33853557/3531672),

public static GraphicsPath RoundedRect(Rectangle bounds, int radius)
{
    int diameter = radius * 2;
    Size size = new Size(diameter, diameter);
    Rectangle arc = new Rectangle(bounds.Location, size);
    GraphicsPath path = new GraphicsPath();

    if (radius == 0)
    {
        path.AddRectangle(bounds);
        return path;
    }

    // top left arc  
    path.AddArc(arc, 180, 90);

    // top right arc  
    arc.X = bounds.Right - diameter;
    path.AddArc(arc, 270, 90);

    // bottom right arc  
    arc.Y = bounds.Bottom - diameter;
    path.AddArc(arc, 0, 90);

    // bottom left arc 
    arc.X = bounds.Left;
    path.AddArc(arc, 90, 90);

    path.CloseFigure();
    return path;
}

тогда в конструкторе просто установили размер самой формы и вызвали SetRegion, определенный выше,

this.Width = toastMessage.Length * 9;
SetRegion();

Обратите внимание, дополнительно, я бы порекомендовал переопределить OnSizeChanged и просто вызвать SetRegion в нем.

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