gpt4 book ai didi

c# - Scroll 事件和 Paint 事件之间的延迟,可能介于两者之间

转载 作者:行者123 更新时间:2023-11-30 16:21:15 24 4
gpt4 key购买 nike

我在表单上有一个简单的面板,我正在使用 AutoScrollMinSize 和 AutoScroll 在我的面板上获得一些滚动条,一切正常。

我还有一个滚动事件,我用它来使整个面板区域无效,因为事实上它似乎只使向左/向右、向上/向下滚动时需要的位无效。除此之外,我使用的是与面板大小相同的 BufferedGraphics,然后执行 .Render(e.Graphics),因为我希望它在整个面板上绘制,就好像滚动条不存在一样.

现在,我遇到的问题是在滚动和绘制内容时似乎存在视觉保持滞后,我认为这是因为在某个地方有一个我不熟悉的额外绘制/设置阶段滚动事件被调用或在该事件与被调用的 Paint 事件之间被调用。

如果我在 paint 方法中有一个无效面板,你看不到问题,但这更多是因为多次调用 paint 事件隐藏了问题。

所以我认为我的理解方式是,当你滚动时,引擎盖下的某些东西会做一个大的矩形 blit 移动已经存在的内容,然后用需要填充的区域的矩形调用 invalidate。

如果是这种情况,是否有任何解决办法,如抑制此阶段或我缺少的其他设置以消除跟上滞后?

PS:我还重写了 OnPaintBackground 方法,它是一个空 stub 。

最佳答案

好的,回答我自己的问题,以防它在极少数情况下对任何人有帮助。从有人提到 LockWindowUpdate 开始,我想到了 WM_SETREDRAW 和这篇文章,SuspendDrawing ,现在我可以平滑滚动并能够绘制整个面板。通过仅让 Scroll 事件执行以下操作。 YMMV.

    [DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int WM_SETREDRAW = 0xB;

private void PanelView_Scroll(object sender, ScrollEventArgs e)
{
Control control = sender as Control;
if (control!=null)
{
if (e.Type == ScrollEventType.ThumbTrack)
{
// Enable drawing
SendMessage(control.Handle, WM_SETREDRAW, 1, 0);
// Refresh the control
control.Refresh();
// Disable drawing
SendMessage(control.Handle, WM_SETREDRAW, 0, 0);
}
else
{
// Enable drawing
SendMessage(control.Handle, WM_SETREDRAW, 1, 0);
control.Invalidate();
}
}
}

关于c# - Scroll 事件和 Paint 事件之间的延迟,可能介于两者之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13415431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com