【问题标题】:Issue when Applying Region to a Form将区域应用于表单时的问题
【发布时间】:2009-08-19 06:52:03
【问题描述】:

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

这可以通过简单地创建一个 Windows 窗体项目并通过使用窗体的大小作为椭圆的边界矩形将椭圆区域应用到窗体来重现(通过这种方式,您将能够调整窗体的大小,因此它的边界不会被区域完全“吃掉”)。

注意:我正在 OnResize 事件中更新 Form 的区域。

我使用的代码如下所示:

 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);
 }

任何想法可能导致这种情况?

快速跟进:

我注意到,当我将相同的代码 sn-p 放入 OnSizeChanged 事件时,闪烁消失或似乎很少发生。

谢谢!

【问题讨论】:

    标签: c# winforms forms region


    【解决方案1】:

    处理绘画事件

    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); 
    }
    

    【讨论】:

    • 这不会是一个巨大的开销,因为即使表单没有调整大小,Paint 事件也会被多次触发?我猜只有在表单大小发生变化时才需要更新区域,而不是在每个 WM_PAINT 消息上?
    【解决方案2】:

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

    我正在使用这个:

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

    而且它工作时不会闪烁。所以值得一试!

    【讨论】:

      猜你喜欢
      • 2015-07-19
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2018-08-25
      • 2018-06-08
      相关资源
      最近更新 更多