DoubleBuffered SplitContainer不显示被拖动的拆分器

时间:2016-01-08 17:58:47

标签: c# winforms double-buffering

我有一个SplitContainer,需要在整个控件上使用DoubleBuffer。

我试图通过使用Hans Passant found here的例子以通常的方式实现这一点,这通常效果很好。

using System.Windows.Forms;

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

不幸的是,这会产生奇怪的副作用,如果您移动分割器,它将不再动画/更新,直到您释放鼠标,这使得很难判断您是否真正重新调整控件的大小。我认为这是因为所有重绘现在都在屏幕上显示,然后才会显示在UI上 (如果将整个SplitContainer背面颜色设置为灰色,然后将每个面板设置为白色,以便清楚地看到分割器,则此效果更容易看到。

我尝试了两个面板的双缓冲(使用更多汉斯魔法)虽然现在看起来似乎显示分割器正确移动但我的孩子控件上有一堆其他闪烁。

public BufferedSplit()
{
    SetStyle(ControlStyles.AllPaintingInWmPaint |
             ControlStyles.UserPaint |
             ControlStyles.OptimizedDoubleBuffer, true);

    var objMethodInfo = typeof(Control).GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance);

    var objArgs = new object[] { ControlStyles.AllPaintingInWmPaint |
                             ControlStyles.UserPaint |
                             ControlStyles.OptimizedDoubleBuffer, true };

    objMethodInfo.Invoke(Panel1, objArgs);
    objMethodInfo.Invoke(Panel2, objArgs);
}

我可以双重缓冲整个SplitContainer控件,还可以在拖动时正确设置分割器的动画效果吗?

WPF不是一个选项!

0 个答案:

没有答案