.net开发中,如何解决面板和Pictureboxes的闪烁问题?

2026-05-08 11:533阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1063个文字,预计阅读时间需要5分钟。

.net开发中,如何解决面板和Pictureboxes的闪烁问题?

我需要一种方法来避免在画布上闪光,我这里提出了很多类似的问题,并向全球专家请教,尝试过多种技巧,扩展画布,创建框架,控制方式,但浪费了太多时间,学到了很多不实用的东西。

我需要一种方法来避免在面板上闪烁,我在这里提出了很多类似的问题,并且全世界试图向专家询问,我尝试过很多技巧,扩展面板,创建框架,控制方式,丢失了很多时候,浪费时间学习那些不起作用的东西……我被困在这一点上.

……没有什么能像预期的那样真正起作用,我找到的最好的“Flicker-Reducer”是“Createparams”覆盖子,但是这种方法使任何Form / App x20倍于Form的任何操作,我不想要松散闪烁,如果这意味着应用程序性能松散(至少不是如果CreateParams的性能负相同).

在这个视频中你可以看到我的测试表格有一个50%透明面板,里面有图片框,背景图像设置为“缩放”分层,当我向上或向下滚动时,我得到了很多闪烁.

www.youtube.com/watch?v=zIBDTMjrDd4&feature=youtu.be

我使用“CreateParams”方法,如果我不使用“CreateParams”,你真的不会看到我的面板闪烁会发生什么,真的很吓人.

这是没有闪烁时的面板:

这是面板在它闪烁的时刻:

这是完整的课程:

It is a Windows Form proyect VS2012 Framework 3.5 On Windows 7 x64 Application Visual Styles is ON Double Buffer is ON Panel and pictureboxes are default controls

(我认为没必要说我已经尝试了所有可能的视觉和环境配置,人们说我永远忘记了闪烁.)

Public Class Form1 Dim Scroll_Position As Int32 = 0 Dim Button_Down_Is_Pressed As Boolean = False Dim Button_Up_Is_Pressed As Boolean = False Dim WithEvents Progressive_Scroll_Timer As New Timer Dim SmallChange As Int32 = 5 Dim Largechange As Int32 = 10 ' Sub which reduces the Flickering, but this sub makes x20 times slower any operation of any Form/Application. Protected Overrides ReadOnly Property CreateParams() As CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = cp.ExStyle Or &H2000000 Return cp End Get End Property 'CreateParams Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' Me.BackColor = Color.FromArgb(255, 0, 0, 0) ' Me.TransparencyKey = Color.FromArgb(255, 0, 0, 0) Panel1.VerticalScroll.Maximum = 999999999 Progressive_Scroll_Timer.Interval = 50 Panel1.BackColor = Color.FromArgb(150, 0, 0, 0) End Sub Private Sub Panel_MouseHover(sender As Object, e As EventArgs) Handles Panel1.MouseHover sender.focus() End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Progressive_Scroll_Timer.Tick If Button_Down_Is_Pressed Then Scroll_Down(SmallChange) ElseIf Button_Up_Is_Pressed Then Scroll_Up(SmallChange) Else sender.stop() End If End Sub Private Sub Scroll_Up(ByVal Change As Int32) Scroll_Position -= Change Panel1.SuspendLayout() Try : Panel1.VerticalScroll.Value = Scroll_Position : Catch : Scroll_Position += Change : End Try Panel1.ResumeLayout() End Sub Private Sub Scroll_Down(ByVal Change As Int32) Scroll_Position += Change Try : Panel1.VerticalScroll.Value = Scroll_Position : Catch : Scroll_Position -= Change : End Try End Sub Private Sub Button_Down_MouseDown(sender As Object, e As MouseEventArgs) Handles Button2.MouseDown If e.Button = Windows.Forms.MouseButtons.Left Then Button_Down_Is_Pressed = True Progressive_Scroll_Timer.Start() End If End Sub Private Sub Button_Up_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown If e.Button = Windows.Forms.MouseButtons.Left Then Button_Up_Is_Pressed = True Progressive_Scroll_Timer.Start() End If End Sub Private Sub Button_Down_MouseUp(sender As Object, e As MouseEventArgs) Handles Button2.MouseUp Button_Down_Is_Pressed = False End Sub Private Sub Button_Up_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp Button_Up_Is_Pressed = False End Sub Private Sub Form_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Panel1.MouseWheel If Panel1.Focused Then Select Case Math.Sign(e.Delta) Case Is > 0 : Scroll_Up(Largechange) Case Is < 0 : Scroll_Down(Largechange) End Select End If End Sub End Class 将Panel的AutoScroll属性设置为true.如果没有这个,滚动似乎不起作用.
添加继承自Panel类的DoubleBufferedPanel类,并将.DoubleBuffered属性设置为true:

.net开发中,如何解决面板和Pictureboxes的闪烁问题?

Public Class DoubleBufferedPanel Inherits Panel Public Sub New() DoubleBuffered = True End Sub End Class

现在转到隐藏的InitializeComponent子(右键单击Panel1变量,然后单击Go To Definition).在需要的地方(两个地方)用DoubleBufferedPanel替换Panel类型:

Me.Panel1 = New WindowsApplication4.DoubleBufferedPanel() .... Friend WithEvents Panel1 As WindowsApplication4.DoubleBufferedPanel

闪烁应该停止(尽管还有一些其他的影响).
删除CreateParams以提高速度.

附:总的来说,这不是一个好主意(移动复杂的半透明图像).你为什么不使用像ListView这样的东西?为什么不在不使用Panel的情况下自己移动图像?如果您想要最佳速度,只需使用Bitmap和Graphics类在表单(.BackgroundImage)上绘制图像.

P.P.S.使用.AutoScroll = true以编程方式滚动Panel似乎存在一些严重错误.我不得不重新分配滚动值以防止严重的抖动.我已经隔离了这个案例,他将向微软提交一份错误报告.

本文共计1063个文字,预计阅读时间需要5分钟。

.net开发中,如何解决面板和Pictureboxes的闪烁问题?

我需要一种方法来避免在画布上闪光,我这里提出了很多类似的问题,并向全球专家请教,尝试过多种技巧,扩展画布,创建框架,控制方式,但浪费了太多时间,学到了很多不实用的东西。

我需要一种方法来避免在面板上闪烁,我在这里提出了很多类似的问题,并且全世界试图向专家询问,我尝试过很多技巧,扩展面板,创建框架,控制方式,丢失了很多时候,浪费时间学习那些不起作用的东西……我被困在这一点上.

……没有什么能像预期的那样真正起作用,我找到的最好的“Flicker-Reducer”是“Createparams”覆盖子,但是这种方法使任何Form / App x20倍于Form的任何操作,我不想要松散闪烁,如果这意味着应用程序性能松散(至少不是如果CreateParams的性能负相同).

在这个视频中你可以看到我的测试表格有一个50%透明面板,里面有图片框,背景图像设置为“缩放”分层,当我向上或向下滚动时,我得到了很多闪烁.

www.youtube.com/watch?v=zIBDTMjrDd4&feature=youtu.be

我使用“CreateParams”方法,如果我不使用“CreateParams”,你真的不会看到我的面板闪烁会发生什么,真的很吓人.

这是没有闪烁时的面板:

这是面板在它闪烁的时刻:

这是完整的课程:

It is a Windows Form proyect VS2012 Framework 3.5 On Windows 7 x64 Application Visual Styles is ON Double Buffer is ON Panel and pictureboxes are default controls

(我认为没必要说我已经尝试了所有可能的视觉和环境配置,人们说我永远忘记了闪烁.)

Public Class Form1 Dim Scroll_Position As Int32 = 0 Dim Button_Down_Is_Pressed As Boolean = False Dim Button_Up_Is_Pressed As Boolean = False Dim WithEvents Progressive_Scroll_Timer As New Timer Dim SmallChange As Int32 = 5 Dim Largechange As Int32 = 10 ' Sub which reduces the Flickering, but this sub makes x20 times slower any operation of any Form/Application. Protected Overrides ReadOnly Property CreateParams() As CreateParams Get Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = cp.ExStyle Or &H2000000 Return cp End Get End Property 'CreateParams Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' Me.BackColor = Color.FromArgb(255, 0, 0, 0) ' Me.TransparencyKey = Color.FromArgb(255, 0, 0, 0) Panel1.VerticalScroll.Maximum = 999999999 Progressive_Scroll_Timer.Interval = 50 Panel1.BackColor = Color.FromArgb(150, 0, 0, 0) End Sub Private Sub Panel_MouseHover(sender As Object, e As EventArgs) Handles Panel1.MouseHover sender.focus() End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Progressive_Scroll_Timer.Tick If Button_Down_Is_Pressed Then Scroll_Down(SmallChange) ElseIf Button_Up_Is_Pressed Then Scroll_Up(SmallChange) Else sender.stop() End If End Sub Private Sub Scroll_Up(ByVal Change As Int32) Scroll_Position -= Change Panel1.SuspendLayout() Try : Panel1.VerticalScroll.Value = Scroll_Position : Catch : Scroll_Position += Change : End Try Panel1.ResumeLayout() End Sub Private Sub Scroll_Down(ByVal Change As Int32) Scroll_Position += Change Try : Panel1.VerticalScroll.Value = Scroll_Position : Catch : Scroll_Position -= Change : End Try End Sub Private Sub Button_Down_MouseDown(sender As Object, e As MouseEventArgs) Handles Button2.MouseDown If e.Button = Windows.Forms.MouseButtons.Left Then Button_Down_Is_Pressed = True Progressive_Scroll_Timer.Start() End If End Sub Private Sub Button_Up_MouseDown(sender As Object, e As MouseEventArgs) Handles Button1.MouseDown If e.Button = Windows.Forms.MouseButtons.Left Then Button_Up_Is_Pressed = True Progressive_Scroll_Timer.Start() End If End Sub Private Sub Button_Down_MouseUp(sender As Object, e As MouseEventArgs) Handles Button2.MouseUp Button_Down_Is_Pressed = False End Sub Private Sub Button_Up_MouseUp(sender As Object, e As MouseEventArgs) Handles Button1.MouseUp Button_Up_Is_Pressed = False End Sub Private Sub Form_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Panel1.MouseWheel If Panel1.Focused Then Select Case Math.Sign(e.Delta) Case Is > 0 : Scroll_Up(Largechange) Case Is < 0 : Scroll_Down(Largechange) End Select End If End Sub End Class 将Panel的AutoScroll属性设置为true.如果没有这个,滚动似乎不起作用.
添加继承自Panel类的DoubleBufferedPanel类,并将.DoubleBuffered属性设置为true:

.net开发中,如何解决面板和Pictureboxes的闪烁问题?

Public Class DoubleBufferedPanel Inherits Panel Public Sub New() DoubleBuffered = True End Sub End Class

现在转到隐藏的InitializeComponent子(右键单击Panel1变量,然后单击Go To Definition).在需要的地方(两个地方)用DoubleBufferedPanel替换Panel类型:

Me.Panel1 = New WindowsApplication4.DoubleBufferedPanel() .... Friend WithEvents Panel1 As WindowsApplication4.DoubleBufferedPanel

闪烁应该停止(尽管还有一些其他的影响).
删除CreateParams以提高速度.

附:总的来说,这不是一个好主意(移动复杂的半透明图像).你为什么不使用像ListView这样的东西?为什么不在不使用Panel的情况下自己移动图像?如果您想要最佳速度,只需使用Bitmap和Graphics类在表单(.BackgroundImage)上绘制图像.

P.P.S.使用.AutoScroll = true以编程方式滚动Panel似乎存在一些严重错误.我不得不重新分配滚动值以防止严重的抖动.我已经隔离了这个案例,他将向微软提交一份错误报告.