Winform 中通过区域 属性 的表单设计被删除

Form design via Region property in winform getting removed

我使用区域 属性 定制了 winform-design 如下,

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 应用的更改消失了,表格看起来像设计时的样子。

图一,最初显示时,

图二,就在表单关闭之前,

我尝试了很多不同的东西,但我没有弄清楚到底是什么问题,所以我们将不胜感激。

最后,我得到了修复,而不是使用 GDI32 中的 CreateRoundRectRgn,而是使用 GraphicsPath 方法,如下所示,

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

这里是 RoundRect 函数的代码(致谢 ),

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