滚动时在Panel中平滑绘制或绘制子控件

时间:2014-07-02 10:16:37

标签: c# winforms panel smooth-scrolling

在Tab控件的TabPage中使用Panel控件时,我有很多子控件,如RichTextBox,Buttons,Labels等。

问题是当我在面板中滚动时,里面有一个闪烁。儿童控件没有像已经存在那样被平滑地显示/淹没/涂抹。

寻找可以使滚动平滑并消除闪烁效果的内容。 任何建议都会有所帮助。我尝试了其他几种方法,比如DoubleBuffered,但并没有真正起作用。

1 个答案:

答案 0 :(得分:2)

我通过组合不同的其他建议解决了这个问题,下面是为我删除闪烁的代码,基本上是使用Win API将其变为DoubleBuffered。

引用herehere

public partial class SmoothScrollPanel : UserControl
{
    public SmoothScrollPanel()
    {
        InitializeComponent();
        // this.DoubleBuffered = true;
    }

    private const int WM_HSCROLL = 0x114;
    private const int WM_VSCROLL = 0x115;

    protected override void WndProc(ref Message m)
    {
        if ((m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
        && (((int)m.WParam & 0xFFFF) == 5))
        {
            // Change SB_THUMBTRACK to SB_THUMBPOSITION
            m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
        }
        base.WndProc(ref m);
    }

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