【问题标题】:Flickering on WinForm UI when Form is resized调整窗体大小时在 WinForm UI 上闪烁
【发布时间】:2019-02-27 16:37:45
【问题描述】:

当我调整 Winform UI(有很多子控件)的大小时,会发生闪烁。 我使用了下面的代码,它不适用于 Resize。

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.Style &= ~0x02000000;// Turn off WS_CLIPCHILDREN
        return cp;
    }
}

【问题讨论】:

  • 你试过turning on double-buffering作为父表单吗?
  • 是的。我努力了。没有运气。
  • 表单的resize事件中有代码吗?如果是,那就展示它

标签: c# winforms resize


【解决方案1】:

创建一个 Panel,它将成为您的 FormForm 中所有子项的根。OnResizeBegin() 方法,调用 Control.SuspendLayout();在FormOnResizeEnd(),调用ControlResumeLayout()

class MainForm: Form {
    public MainForm()
    {
        this.Build();
    }

    void Build()
    {
        this.root =  new Panel { Dock = DockStyle.Fill };
        // create all controls and add them to root

        this.Controls.Add( root );
        this.ResizeBegin += (obj, args) => this.OnResizeBegin();
        this.ResizeEnd += (obj, args) => this.OnResizeEnd();
    }

    void OnResizeBegin()
    {
        this.root.SuspendLayout();
    }

    void OnResizeEnd()
    {    
        this.root.ResumeLayout( true );
    }

    Panel root;
}

希望这会有所帮助。

【讨论】:

  • “我无法将它们保留在面板中,因为我有多个用户控件位于表单的不同部分。”我认为这甚至是不可能的。 Form 基本上是一个带有 FillTopBottom 等区域的常规面板。你怎么不能把所有的控件都挂在一个面板上?。
【解决方案2】:

我认为您应该更改 ExStyle 而不是 Style 以获得双缓冲效果
你也应该使用|= 而不是&=

protected override CreateParams CreateParams
{
    get 
    { 
         CreateParams cp = base.CreateParams;
         cp.ExStyle |= 0x02000000; // turn on WS_EX_COMPOSITED
         return cp;
    }
}

如果您的表单上仍有部分不断闪烁,那么 this post 可能会有所帮助

【讨论】:

  • 在调整表单大小时是否执行了任何代码?您还查看了我答案中的链接吗?
  • with WS_EX_COMPOSITED my form gets event on some button clicks 是什么意思?
  • 使用 WS_EX_COMPOSITED 我的表单在单击某些按钮时会闪烁。当我从 'cp.ExStyle |= 0x02000000;' 更改代码时到 'cp.Style &= ~0x02000000;'按钮点击时的闪烁明显减少。但是我仍然可以看到在关闭剪辑儿童时调整大小时闪烁。我已经通过链接。我在一个地方的表单中有一个重叠的控件。
  • 对于调整大小有一些代码,但即使在评论和尝试了一些事情之后,比如在调整大小开始和调整结束时暂停和恢复布局也没有帮助
  • 很奇怪。剪辑儿童不是双缓冲,但它确实可以帮助闪烁。但是双缓冲应该可以解决任何闪烁问题。绘画或调整大小事件中是否有任何代码?
猜你喜欢
  • 2019-01-09
  • 1970-01-01
  • 2014-01-24
  • 2014-12-29
  • 2016-03-19
  • 2010-11-22
  • 2022-10-13
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多