我有一些屏幕上有很多东西,重绘性能很差。可以将窗体设置为调整大小模式,其中在用户调整窗口大小时在屏幕上显示一个表示新窗口大小的矩形,但实际窗体在放开鼠标按钮之前不会调整大小?在用户放开鼠标按钮之前,我可以让窗口不会调整大小吗?
谢谢!
我有一些屏幕上有很多东西,重绘性能很差。可以将窗体设置为调整大小模式,其中在用户调整窗口大小时在屏幕上显示一个表示新窗口大小的矩形,但实际窗体在放开鼠标按钮之前不会调整大小?在用户放开鼠标按钮之前,我可以让窗口不会调整大小吗?
谢谢!
您是否尝试过使用WinForm/Control的DoubleBuffer功能?
是;此行为由其中一种窗口样式定义,您可以使用Control.SetStyles
方法打开/关闭该窗口样式。特别是,我想你想要这样的:
myForm.SetStyle(ControlStyles.ResizeRedraw, false);
你可以再勾鼠标按下/调整/鼠标松开事件,并强制重绘当你想要发生。
您也可以尝试启用双缓冲风格:
myForm.SetStyle(ControlStyles.DoubleBuffer, true);
请参阅本文的详细信息:http://msdn.microsoft.com/en-us/library/fkf25009(v=vs.100).aspx
setstyle似乎没有效果。 – 2012-03-25 05:16:55
您可能需要在更改样式后调用UpdateStyles。 – 2012-03-25 16:43:53
如何使用ResizeEnd
代替Resize
。
完全抑制所有绘图并不实际,窗框画不在您的直接控制范围内。也不是必须的,你所要做的就是在表单被调整大小时快速绘制图形。就像这样:
private bool fastRender;
protected override void OnResizeBegin(EventArgs e) {
fastRender = true;
base.OnResizeBegin(e);
}
protected override void OnResizeEnd(EventArgs e) {
base.OnResizeEnd(e);
fastRender = false;
this.Invalidate();
}
并为您在您的Paint事件处理程序的fastRender变量,仅绘制的最小值。或者什么也没有。如果实际的延迟是由大量控件引起的,那么通过使它们在ResizeBegin中不可见并在ResizeEnd中再次可见来解决这个问题。易于使用面板。如果是由停靠的控件引起,或者设置了锚点,以便在用户调整窗口大小时调整大小或移动,则会发现Suspend/ResumeLayout有用。
在我的情况下,这是一个非常大的停靠的datagridview,真的会减慢速度。 – 2012-03-25 17:41:18
我只是回想起windows 95的日子,那里有一个很好的矩形,显示了新窗口的尺寸,当你放开窗口时,窗口的大小适合这个尺寸。我不记得它是什么时候改变为每次增加调整大小再次绘制窗口。 – 2012-03-25 17:44:54
如果它只是停靠的DGV,那么在OnResizeEnd()中调用OnResizeBegin和ResumeLayout(true)中的SuspendLayout将会很好地工作。调整窗口大小时,DGV不会重新绘制,因此它会光滑平滑。 – 2012-03-25 17:55:43
打开异常大小的窗口;然后按住控制键,按下+键,直到您恢复到所需的尺寸。祝你好运。
我使用了一种特殊的技巧,假设双倍缓冲屏幕上的每个控件。现在我的闪烁很小,但调整性能很糟糕。 – 2012-03-25 05:01:38