使用DoubleBuffering和FormBorderStyle.None在Windows10上重画问题

时间:2018-08-13 14:03:06

标签: c# winforms windows-10 doublebuffered

我有一个Windows Forms项目问题,我只能在Windows 10机器上重现该问题(在Windows 7上可以正常工作)。我认为我可以找出问题的根源,也就是说,如果我打开双缓冲并将FormBorderStyle设置为None,那么如果我调整窗体的大小,例如在事件处理程序中,后台部分和某些控件未重绘。也是如此,有时它会起作用(五分之一)。

看起来没有重绘(通常有点不同):

enter image description here

,所以它看起来应该像:

enter image description here

要重现该问题,只需将几个控件置于表单上(可能数量也可能很重要),通过覆盖CreateParamsFormBorderStyle=None(使用另一种边框样式)来打开双缓冲有用!)。

后面的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
            return cp;
        }
    }

    private bool small = true;
    private void button1_Click(object sender, EventArgs e)
    {
        //toggle the form's size
        Height = Height + 300*(small?-1:1);
        small = !small;
    }

    private void button5_Click(object sender, EventArgs e)
    {
        Close();
    }
}

问题:
是来自Windows 10中MS的已知错误(或者可能是为了摆脱Windows窗体;))?
有什么想法吗?
双缓冲,没有边界。

更新:我有Win 10专业版:1703;版本15063.1155。
Update2:在Win 10 Pro版本上测试:1709;内部版本16299.492-同样的问题。

Update3:在Win 10 Home Version:1803上进行测试-更好的方法(我需要进行几分钟的测试才能重现它),但是仍然出现问题。该测试是在另一台装有另一张图形卡的计算机上完成的。

解决方法:
恐怕我必须采用这种解决方法A: Remove the title bar in Windows Forms,并将FormBorderStyle设置为FixedToolWindow

1 个答案:

答案 0 :(得分:1)

对我来说,这看起来像是操作系统中的错误,但是我发现如何在不放弃DoubleBufferingFormBorderStyle=None的情况下使其正常工作。

如果窗口样式将扩展

cp.ExStyle |= 0x00080000;   // Turn on WS_EX_LAYERED

然后一切正常。