当调整大小时,有没有办法防止picturebox闪烁?

3
我有一张图像想要包含在我的vb.net应用程序中,所以我在Photoshop中将它切成了多个图片框,并相应地锚定它们,这样当我的应用程序被调整大小时,它不会拉伸图像的所有部分。看起来很好,几乎很好用,但是当调整窗体大小时,图片框会出现闪烁。
我知道图片框不是最快的控件,所以我猜测它刷新得不够快。除了闪烁之外,即使图片框是透明的,它仍然显示为白色背景。
我尝试添加背景颜色希望能更好地隐藏闪烁,但没有成功。
所以我的第一个问题是有没有什么方法可以防止这种情况?如果没有,有哪些控件比较快?
也许有人知道自定义图片框,或者您知道速度更快的控件。基本上,任何允许背景图片和透明背景颜色的控件都可以使用,只要它更快。
我真的很感谢您的帮助。谢谢。PS:我的应用程序是在VB.net中,但我也会添加一个C#标签,因为我很可能需要通过代码切换控件而不是修复它。

你的构造函数长什么样子?你尝试过设置 DoubleBuffered = true 吗? - MethodMan
如果您在屏幕右侧查看,您会发现一个先前的问题:https://dev59.com/uUXRa4cB1Zd3GeqPpCH-?rq=1 - Steve
谢谢。我看了一下,不确定在哪里添加双缓冲布尔值。我尝试创建一个子项,但它重置了我的表单。 - user1632018
获取示例代码:点击这里 - Ken Kin
2个回答

7

为了避免表单控件闪烁,您可以使用以下函数。只需将其复制并粘贴到表单.vb中的任何位置即可。

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

只有在只读属性上粘贴


哇,你是怎么做到的?+1!我已经寻找解决方案来避免我的面板闪烁4个月了!在这个论坛和其他论坛询问,在阅读和尝试子类面板之后...你只用几行代码就得到了解决方案!真的很棒,谢谢你。但是你能解释一下这些代码是什么意思吗? - ElektroStudios
@ElektroStudios 请查看微软文档中的此链接以了解 https://learn.microsoft.com/en-us/windows/desktop/winmsg/extended-window-styles - Nathan
另外,如果您将此放置在MDI父窗体中,则会修复所有子窗体,而无需在每个窗体类中放置代码片段。 - Nathan

1

处理此问题的两种方法是:

a)在picturebox中调整图像大小,使其更小并且能够更快地重新绘制

b)使用计时器重新绘制图像,以便在上一次调整大小事件后100至350毫秒之后才开始重新绘制。


好的,那么我会在计时器中添加重新绘制的代码,然后在窗体调整大小处理程序中启用计时器?完成后再禁用?如何停止自动刷新?我猜我得以某种方式覆盖绘图过程?如果完全错误,请原谅,这个特殊的图形东西对我来说很新。 - user1632018
在处理程序中禁用计时器。我认为你可以在图片框的绘制事件中防止它刷新(或者在那里启动计时器),但我还没有测试过。 - xpda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接