一尘不染

Winforms双缓冲

c#

我将此添加到窗体的构造函数代码中:

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);

但是,当加载控件时,无论控件何时更改(窗体及其组件经常更改(需要更新)),它仍然显示难看的工件。

我需要做些什么?


阅读 257

收藏
2020-05-19

共1个答案

一尘不染

这仅对表单本身有影响,而对子控件没有影响。如果您有很多人,那么他们轮流绘画自己的时间就会变得很明显,这会留下一个矩形孔,在该处控件将被填充,直到子控件将其旋转为止。

要解决这个问题,您需要对整个表单 控件进行双重缓冲。自Windows
XP启用WS_EX_COMPOSITED样式标志以来,该选项就可用。将此粘贴到您的表单中以将其打开:

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

它根本无法加快绘画速度,但是延迟一段时间后,表格会吸附在屏幕上。消除可见的油漆瑕疵。真正解决延迟问题无需使用控件。通过使用OnPaint方法绘制“控件”并使OnMouseClick事件智能化用户单击了什么“控件”,您将执行哪些操作。

2020-05-19