在没有滞后的表单上绘制图形?

时间:2012-10-10 19:42:07

标签: vb.net winforms gdi

我的方法的问题是图像,文本或线条绘制,在调整表单大小时可能会滞后0.2秒。因此,如果您需要右下角的图像,调整大小后需要0.2秒才能到位。此外,如果你进行大量调整,它会开始下降到1-2FPS,而表格会在大屏幕上扩展。示例代码如下所示(VB.NET):

Public Class Form1
  Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(e)
    Dim icon As Icon = SystemIcons.Exclamation
    Dim imageWidth As Integer = icon.Width
    Dim imageHeight As Integer = icon.Height
    e.Graphics.DrawIcon(icon, Me.ClientRectangle.Right - imageWidth,
                              Me.ClientRectangle.Bottom - imageHeight)
  End Sub
  Private Sub Form1_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
    Me.Invalidate()
  End Sub
End Class

有什么方法可以让它更顺畅吗?

2 个答案:

答案 0 :(得分:2)

Windows窗体提供style setting来缓冲屏幕。这为你做了很多设置。

此外,双缓冲无需清除屏幕,因此覆盖OnPaintBackground并返回而不调用基类将阻止大量无法看到的工作。

对于GDI + / winforms双缓冲的一些最佳示例,请查看我的animation examples

答案 1 :(得分:1)

调整窗口大小始终会涉及在新位置重新绘制图像。但是,您可以尝试一些可能会或可能不会使重绘更有效的事情。

  1. 仅使图像的旧位置和新位置无效,而不是整个表单。这意味着您不必绘制窗口中不会更改的部分。
  2. 将图像从旧位置复制到新位置。在这里你必须要小心使窗口的正确部分无效,特别是当窗口变小并且新旧图像区域重叠时。
  3. 为图像创建单独的控件,并将控件移动到正确的位置。然后,表单和控件将自动使正确的区域无效。