C# 暂停/恢复绘制treeview的滚动条

C# 暂停/恢复绘制treeview的滚动条,c#,treeview,repaint,scrollbars,redraw,C#,Treeview,Repaint,Scrollbars,Redraw,我试图阻止树视图的垂直滚动条在重画树视图时闪烁。我已经有了一个自定义的treeview控件,它可以使用WndProc禁用绘制,它对treeview本身也很好,但不会阻止treeview的滚动条在我清除/创建treeview中的节点时重新绘制和闪烁 有什么解决办法吗?以下是自定义树视图中的代码: private bool enablePaint = true; protected override void WndProc(ref Message m) {

我试图阻止树视图的垂直滚动条在重画树视图时闪烁。我已经有了一个自定义的treeview控件,它可以使用WndProc禁用绘制,它对treeview本身也很好,但不会阻止treeview的滚动条在我清除/创建treeview中的节点时重新绘制和闪烁

有什么解决办法吗?以下是自定义树视图中的代码:

    private bool enablePaint = true;
    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_PAINT:
                if (enablePaint)
                    base.WndProc(ref m);
                break;
            case WM_ERASEBKGND:
                break;
            default:
                base.WndProc(ref m);
                break;
        }
    }

感谢您的帮助。

我使用LockWindowUpdate找到了解决方案:

    [DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    [DllImport("user32.dll")]
    private static extern bool LockWindowUpdate(IntPtr hWndLock);
    public new void BeginUpdate()
    {
        SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
        LockWindowUpdate(this.Handle);
    }
    public new void EndUpdate()
    {
        LockWindowUpdate(IntPtr.Zero);
        SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
    }

我很确定SuspendLayout和ResumeLayout在幕后使用LockWindowUpdate。我可能错了。我试过了,比如用它们替换了LockWindowUpdate,但是垂直滚动条闪烁。LWU是我发现的唯一有效的解决方案。