C# 将区域应用于窗体时出现的问题

C# 将区域应用于窗体时出现的问题,c#,winforms,forms,region,C#,Winforms,Forms,Region,当我将非矩形区域应用于Windows窗体(比如椭圆)时,我面临一种奇怪的行为。问题是,在最初调整大小时,表单似乎消失了一段时间(好像区域是空的)。它看起来像是一个轻微的闪烁,而表单后面的桌面内容在几秒钟内变得可见。第一次调整大小后,此闪烁不再可见 只需创建一个Windows窗体项目,并将窗体大小用作椭圆的边界矩形,将椭圆区域应用于窗体,就可以重现此效果(通过这种方式,您可以调整窗体大小,因此其边框不会完全被区域“吃掉”) 注意:我正在OnResize事件中更新表单的区域 我使用的代码如下所示:

当我将非矩形区域应用于Windows窗体(比如椭圆)时,我面临一种奇怪的行为。问题是,在最初调整大小时,表单似乎消失了一段时间(好像区域是空的)。它看起来像是一个轻微的闪烁,而表单后面的桌面内容在几秒钟内变得可见。第一次调整大小后,此闪烁不再可见

只需创建一个Windows窗体项目,并将窗体大小用作椭圆的边界矩形,将椭圆区域应用于窗体,就可以重现此效果(通过这种方式,您可以调整窗体大小,因此其边框不会完全被区域“吃掉”)

注意:我正在OnResize事件中更新表单的区域

我使用的代码如下所示:

 protected override void OnResize(EventArgs e)
 {
     base.OnResize(e);
     GraphicsPath path = new GraphicsPath();
     path.AddEllipse(new Rectangle(Point.Empty, this.Size));

     this.Region = new Region(path);
 }
你知道这是什么原因吗

快速跟进:

我注意到,当我在OnSizeChanged事件中放入相同的代码片段时,闪烁消失或似乎很少发生

谢谢

处理绘制事件

private void Form1_Paint(object sender, PaintEventArgs e)
{
GraphicsPath path = new GraphicsPath(); 
path.AddEllipse(new Rectangle(Point.Empty, this.Size)); 
this.Region = new Region(path); 
}
处理绘制事件

private void Form1_Paint(object sender, PaintEventArgs e)
{
GraphicsPath path = new GraphicsPath(); 
path.AddEllipse(new Rectangle(Point.Empty, this.Size)); 
this.Region = new Region(path); 
}

你在同一地区为我解决了一个大问题

我用这个:

    private void BorderedPanel_SizeChanged(object sender, EventArgs e)
    {
        this.Region = new Region(RoundedRectangle.CreatePlusOne(this.ClientRectangle, this.cornerRadius, this.RectangleCorners));
        Refresh();
    }

而且它不会闪烁。所以值得一试

你在同一领域为我解决了一个大问题

我用这个:

    private void BorderedPanel_SizeChanged(object sender, EventArgs e)
    {
        this.Region = new Region(RoundedRectangle.CreatePlusOne(this.ClientRectangle, this.cornerRadius, this.RectangleCorners));
        Refresh();
    }

而且它不会闪烁。所以值得一试

这难道不是一个巨大的开销,因为即使表单没有调整大小,绘制事件也会被多次触发吗?我猜只有当表单的大小改变时才需要更新区域,而不是在每个WM_PAINT消息上?这不是一个巨大的开销吗?因为即使表单没有调整大小,也会多次触发PAINT事件?我猜只有当表单的大小改变时,才需要更新区域,而不是在每个WM_PAINT消息上?