Winforms慢速gui(绘图控件)-vb.net
我正在vb.net(winforms)中创建一个应用程序Winforms慢速gui(绘图控件)-vb.net,vb.net,winforms,performance,user-interface,Vb.net,Winforms,Performance,User Interface,我正在vb.net(winforms)中创建一个应用程序 在mainform中,我创建了4个面板,每个面板大约有15个控件。表单还有4个按钮用于切换面板。每个按钮将当前面板可见设置为false,另一个面板可见设置为true 表单有背景图像,面板是透明的。 如果我切换一个面板,你会看到背景被重新绘制(它“闪烁”)。我不想这样,所以我想出了一个解决方案:我用相同的图像设置了4个面板的背景,现在“闪烁”消失了,但是面板的控件绘制得非常慢-特别是当第一个面板的控件与第二个面板的控件位于同一位置时。
在mainform中,我创建了4个面板,每个面板大约有15个控件。表单还有4个按钮用于切换面板。每个按钮将当前面板可见设置为false,另一个面板可见设置为true
表单有背景图像,面板是透明的。 如果我切换一个面板,你会看到背景被重新绘制(它“闪烁”)。我不想这样,所以我想出了一个解决方案:我用相同的图像设置了4个面板的背景,现在“闪烁”消失了,但是面板的控件绘制得非常慢-特别是当第一个面板的控件与第二个面板的控件位于同一位置时。
我已经试过做“SuspendLayout”和“ResumeLayout”,所以这对我不起作用。
我还尝试在firstPanel.visible=false和secondPanel.visible=true之间执行“Refresh()”,但随后我又得到了“flicking”。
那么,有人有一些解决方案可以让我的应用程序更快吗
编辑:重要的是,如果我在没有背景图片的情况下尝试同样的方法,效果会很好 我编写了一个自定义控制面板,以解决我的应用程序渲染性能缓慢的问题。 代码如下:
Public Class PanelDoubleBuffer
Inherits Panel
'MAIN LAYOUT design scheme
Public Property PANEL_CLOSED_STATE_DIM As Integer = 40
Public Property PANEL_OPEN_STATE_DIM As Integer = 400
Public Property ShowVerticalScrolBar As Boolean = False
Public Property ShowHorizontalScrolBar As Boolean = False
Public Sub New()
SuspendLayout()
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.UserPaint, True)
SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.ResizeRedraw, True)
Me.UpdateStyles()
ResumeLayout()
End Sub
<DllImport("user32.dll")>
Private Shared Function ShowScrollBar(ByVal hWnd As IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean
End Function
Public Property SB_HORZ As Integer = ShowHorizontalScrolBar
Public Property SB_VERT As Integer = ShowVerticalScrolBar
Public Property SB_CTL As Integer = 2
Public Property SB_BOTH As Integer = 3
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = &H85 Then
ShowScrollBar(Me.Handle, CInt(SB_BOTH), False)
End If
MyBase.WndProc(m)
End Sub
<DllImport("user32.dll")>
Private Shared Function SendMessage(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End Function
Private Const WM_SETREDRAW As Integer = &HB
Private Sub PanelView_Scroll(ByVal sender As Object, ByVal e As ScrollEventArgs)
Dim control As Control = TryCast(sender, Control)
If control IsNot Nothing Then
If e.Type = ScrollEventType.ThumbTrack Then
SendMessage(control.Handle, WM_SETREDRAW, 1, 0)
control.Refresh()
SendMessage(control.Handle, WM_SETREDRAW, 0, 0)
Else
SendMessage(control.Handle, WM_SETREDRAW, 1, 0)
control.Invalidate()
End If
End If
End Sub
End Class
无法确定这是否会使应用程序更快,但我将尝试设置属性
Form.DoubleBuffered=True
。告诉我它是否改变了你的想法situation@Steve它消除了闪烁,但为了使它画得更快,您还需要删除其他图像背景。@Pietu1998当然,有了这样的更改,您需要在测试性能时重新开始。忘了提到Form.DoubleBuffered=true。。。我听说这可能是另一个解决方案,但不是在这里。。。考虑在WPF中创建应用程序,希望获得更好的性能。答案如下:
Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or 33554432
Return cp
End Get
End Property