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

我有一个Windows窗体项目的问题,我只能在Windows 10机器上重现(在Windows 7上它确实有效)。 我认为我可以隔离问题的来源,即,如果我打开双缓冲并将FormBorderStyle设置为None ,那么如果我在事件处理程序中调整窗体大小,则背景的部分和一些控件不会被重绘。 它也是如此,有时它起作用(从五点开始一次)。

没有重新绘制它看起来如此(通常有点不同):

在此处输入图像描述

它应该看起来像:

在此处输入图像描述

要重现这个问题,只需将几个控件添加到表单中(可能数量也很重要),通过覆盖CreateParams切换双缓冲, FormBorderStyle=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(); } } 

题:
它是来自MS的已知错误(或可能是意图,摆脱Windows窗体;))在Windows 10
有任何想法吗?
双缓冲,没有边框必须。

更新:我有一个Win 10专业版:1703; 建立15063.1155。
Update2:在Win 10 Pro版本上测试:1709; Build 16299.492 – 同样的问题。

Update3:在Win 10 Home版本上进行测试:1803 – 很多(我需要几分钟的测试来重现它),但问题仍然存在。 此测试是在另一台带有另一块显卡的计算机上完成的。

解决方法:
我担心我必须采用这种方式作为解决方法A:删除Windows窗体中的标题栏并将FormBorderStyle设置为FixedToolWindow

对我来说,它看起来像操作系统中的错误,但我已经找到了如何让它工作而不放弃DoubleBufferingFormBorderStyle=None

如果窗口样式将延长

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

然后一切按预期工作。