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
。
我使用区域 属性 定制了 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
。