Winforms 通过winform中的区域属性进行表单设计已被删除

Winforms 通过winform中的区域属性进行表单设计已被删除,winforms,region,Winforms,Region,我使用region属性定制了winform设计,如下所示 Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, varPassedInConstructor * 9, Height, 10, 10)); private void SetRegion() { var GP = RoundedRect(this.ClientRectangle, 5); this.Region = new Region(GP

我使用region属性定制了winform设计,如下所示

Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, varPassedInConstructor * 9, Height, 10, 10));
private void SetRegion()
{
    var GP = RoundedRect(this.ClientRectangle, 5);
    this.Region = new Region(GP);
}
在这里,在一个新线程中通过以下代码调用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();
一切进展顺利,表单最初正确显示,但在突然关闭之前,通过区域应用的更改将消失,表单看起来与设计时一样

图像一,最初显示表单时,

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


我尝试了很多不同的东西,我没有得到确切的问题是什么,所以所有的帮助将不胜感激。

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

Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, varPassedInConstructor * 9, Height, 10, 10));
private void SetRegion()
{
    var GP = RoundedRect(this.ClientRectangle, 5);
    this.Region = new Region(GP);
}
这是RoundRect函数的代码

然后在构造函数中,只需设置表单本身的大小,并调用上面定义的SetRegion

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

另外,请注意,我建议覆盖
OnSizeChanged
,只需在其中调用
SetRegion

可能您只是忘记了在调整表单大小时重新应用区域。重写
OnLayout
也应该有效。这是一种发生在泄露操作系统句柄的程序中的灾难。操作系统不允许一个程序创建太多的内存,它会在10000个内存之后拔掉插头。我们不必看得太远就能看到这样的泄漏,CreateRoundRectRgn()返回一个句柄,该句柄需要通过DeleteObject()调用释放。也没有检查,因此此操作会自动失败。使用任务管理器的“进程”选项卡,并添加GDI对象列以查看它是否泄漏。也要摆脱在辅助线程上创建表单对象的习惯,这很少有好的结果。使用计时器。@Jimi我尝试了您建议的解决方案,但运气不好,我处理了布局事件,但没有任何影响。@HansPassant感谢您提供的信息,我意识到我犯了错误,所以我已经纠正了,现在我释放了窗体关闭事件的句柄,但它并没有解决我的问题,即使在第一次运行时窗体本身也会扭曲,所以我做的任何其他错事。