我在面板上使用文本框附件,然后使用滚动条滚动面板,而不是使用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());
它也不起作用,所以我真的厌倦了这个问题。
有谁知道这个案子?
答案 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();