c#winform自定义滚动条使桌面闪烁

时间:2011-03-04 18:40:30

标签: c# winforms scrollbar

我在面板上使用文本框附件,然后使用滚动条滚动面板,而不是使用Windows默认滚动条。

但问题是我在滚动时使用LockWindowUpdate,这会影响桌面窗口并使其在windows xp中闪烁。

非常有趣的是,一旦我在winXp中打开文件浏览器并在文件浏览器中滚动滚动条。然后返回我的应用程序并再次滚动我的自定义滚动条,闪烁消失。

有没有人知道在这种情况下究竟发生了什么。 LockWindowUpdate如何工作?

谢谢

protected override void OnScroll(ScrollEventArgs se)
{


         if (se.Type == ScrollEventType.First)
            {
                LockWindowUpdate(this.Handle);
            }
            else if (se.Type == ScrollEventType.ThumbTrack /* || se.Type == ScrollEventType.ThumbPosition*/)
            {
                LockWindowUpdate(IntPtr.Zero);
                this.Refresh();
                LockWindowUpdate(this.Handle);
            }
            else
            {
                LockWindowUpdate(IntPtr.Zero);
                this.Invalidate();
                LockWindowUpdate(IntPtr.Zero);
            }
            base.OnScroll(se);
}

是面板滚动事件的代码 我只需使用自定义滚动条将面板滚动到正确的位置。

如果我使用

SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
该小组仍然抖动很多。

我今天发现,如果我只是将一个图标聚焦在桌面上,桌面就不会闪烁了,但我在程序中添加了代码

SetForegroundWindow(Win32API.GetDesktopWindow());

它也不起作用,所以我真的厌倦了这个问题。

有谁知道这个案子?

2 个答案:

答案 0 :(得分:1)

试试这个:

protected override void OnPaintBackground(PaintEventArgs e)
{
// Left empty to avoid undesirable flickering.
}

答案 1 :(得分:0)

此主题可能会有所帮助: How do I suspend painting for a control and its children?

尝试使用WM_SETREDRAW(禁用)而不是LockWindowUpdate();