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

13

本文介绍了使用 DoubleBuffering 和 FormBorderStyle.None 在 Windows10 上重绘问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

I have an issue with a Windows Forms project, which I can reproduce only on Windows 10 machine (on Windows 7 it does work). I think that I could isolate the source of issue, namely, if I switch double buffering on and set FormBorderStyle to None, then if I resize the form e.g. in an event handler, the parts of background and some controls being not redrawn. It is also so, that sometimes it works(one time from five).

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

Not redrawn it looks so(often a bit different):

所以它应该看起来像:

要重现该问题,只需在表单上添加几个控件(可能数量也很重要),通过覆盖 CreateParamsFormBorderStyle=None<来打开双缓冲/code> (它可以使用另一种边框样式!).

To reproduce the issue, just put a couple of controls to the form(may be amount can be also important), switch double buffering on via overriding of CreateParams, FormBorderStyle=None (with another border style it works!).

后面的代码:

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 窗体;))?
有什么想法吗?
双缓冲且无边框必须.

Question:
Is it a known bug from MS(or may be intention, to get rid of windows forms ;) ) in Windows 10?
Any ideas?
Double buffering and no border must be.

更新:我有一个 Win 10 Pro 版本:1703;构建 15063.1155.
Update2: 在 Win 10 Pro 版本上测试:1709;构建 16299.492 - 同样的问题.

Update: I have a Win 10 Pro Version: 1703; Build 15063.1155.
Update2: Test on Win 10 Pro Version: 1709; Build 16299.492 - the same issue.

更新 3: 在 Win 10 家庭版上测试:1803 - 好多了(我需要几分钟的测试才能重现它),但问题仍然存在.此测试是在另一台使用另一张显卡的计算机上完成的.

Update3: Test on Win 10 Home Version: 1803 - much beter(I needed a couple of minutes of testing to reproduce it), but issue still appears. This test was done on another computer with another graphic card.

解决方法:
恐怕我必须这样做作为解决方法A:删除Windows窗体中的标题栏并设置FormBorderStyleFixedToolWindow 为例.

推荐答案

对我来说这看起来像是操作系统中的一个错误,但我已经找到了如何在不放弃 DoubleBufferingDoubleBuffering 的情况下让它工作代码>FormBorderStyle=None.

For me it looks like an error in OS, but I have found how to make it work without give up on DoubleBuffering and FormBorderStyle=None.

如果窗口样式将被扩展

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

然后一切都按预期工作.

then all works as expected.

这篇关于使用 DoubleBuffering 和 FormBorderStyle.None 在 Windows10 上重绘问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

C# 中的多播委托奇怪行为?
Multicast delegate weird behavior in C#?(C# 中的多播委托奇怪行为?)...
2023-11-11 C#/.NET开发问题
6

参数计数与调用不匹配?
Parameter count mismatch with Invoke?(参数计数与调用不匹配?)...
2023-11-11 C#/.NET开发问题
26

如何将代表存储在列表中
How to store delegates in a List(如何将代表存储在列表中)...
2023-11-11 C#/.NET开发问题
6

代表如何工作(在后台)?
How delegates work (in the background)?(代表如何工作(在后台)?)...
2023-11-11 C#/.NET开发问题
5

没有 EndInvoke 的 C# 异步调用?
C# Asynchronous call without EndInvoke?(没有 EndInvoke 的 C# 异步调用?)...
2023-11-11 C#/.NET开发问题
2

Delegate.CreateDelegate() 和泛型:错误绑定到目标方法
Delegate.CreateDelegate() and generics: Error binding to target method(Delegate.CreateDelegate() 和泛型:错误绑定到目标方法)...
2023-11-11 C#/.NET开发问题
14