C# 在滚动面板时关闭/打开运行时合成的WS_EX_

C# 在滚动面板时关闭/打开运行时合成的WS_EX_,c#,windows,scroll,panel,C#,Windows,Scroll,Panel,我们是否可以仅在滚动面板/容器控件时打开WS_EX_COMPOSITED,然后将其关闭?在应用程序的整个生命周期中激活它,会影响应用程序周围的每个控件,我只需要在滚动面板时激活它 诸如此类: private int originalExStyle = -1; private bool _scrolling = false; protected override CreateParams CreateParams { get {

我们是否可以仅在滚动面板/容器控件时打开WS_EX_COMPOSITED,然后将其关闭?在应用程序的整个生命周期中激活它,会影响应用程序周围的每个控件,我只需要在滚动面板时激活它

诸如此类:

    private int originalExStyle = -1;
    private bool _scrolling = false;

    protected override CreateParams CreateParams
    {
        get
        {

            if (originalExStyle == -1)
                originalExStyle = base.CreateParams.ExStyle;

            CreateParams cp = base.CreateParams;

            if (_scrolling)
                cp.ExStyle |= 0x02000000; // Turn on
            else
                cp.ExStyle = originalExStyle; // Reset to original state

            return cp;
        }
    }

    protected override void OnScrollBegin(ScrollEventArgs se)
    {
        base.OnScrollBegin(se);
        _scrolling = true;
        RecreateHandle();
    }

    protected override void OnScrollEnd(ScrollEventArgs se)
    {
        base.OnScrollEnd(se);
        _scrolling = false;
        RecreateHandle();
    }

请不要
重新创建句柄()像那样。也许您只需要通过启用容器的
DoubleBuffered
属性来双重缓冲容器,而不是应用
WS_EX_COMPOSITED
样式来双重缓冲它包含的所有内容。阅读更多。作为
CreateParams
添加/删除样式/标志的替代方法,您可以使用
GetWindowLongPtr
SetWindowLongPtr
函数。谢谢!是的,我知道,这只是一个例子,也是我唯一知道的重新调用CreateParams方法的选项,也许UpdateStyles也会起作用。我很可能会让它被双缓冲,有一天我会创建一个自定义滚动处理(将控件隐藏在视口之外,等等)。激活WS_EX_COMPOSITED非常糟糕。