如何DoubleBuffered
在遭受闪烁的表单上设置控件的受保护属性?
我将此添加到我的表单的构造函数代码中:
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
Run Code Online (Sandbox Code Playgroud)
但是当它加载控件时,无论何时更改(表单及其组件经常更改(需要更新)),它仍会显示丑陋的工件.
我需要做些什么不同的事情?
我有一些库"自定义控件".基本上我们有自己的按钮,圆角板和一些带有一些定制油漆的组合箱.尽管OnPaint方法中存在"数学",但控件非常标准.大多数情况下,我们所做的只是绘制圆角并为背景添加渐变.我们使用GDI +来实现这一切.
这些控件都可以(根据我们的客户非常好看),但是尽管有DoubleBuffer,你可以看到一些重绘,特别是当同一个表格上有20个++按钮时(例如).在表单加载时,您会看到绘制的按钮...这很烦人.
我很确定我们的按钮不是地球上最快的东西,但我的问题是:如果双缓冲区"打开",那么不应该在后台进行所有重绘,而Windows子系统应该"立即"显示结果吗?
另一方面,如果存在将创建标签的"复杂"foreach循环,则将它们添加到面板(双缓冲)并更改其属性,如果我们在循环之前挂起面板并在循环时恢复面板布局结束,不应该所有这些控件(标签和按钮)"几乎立即"出现?这不会发生这种情况,您可以看到面板被填充.
知道为什么不发生这种情况吗?我知道很难在没有示例代码的情况下进行评估,但这也难以复制.我可以用相机制作一个视频,但相信我这个,它不是很快:)
创建新表单后,我通常会执行此仪式:
Caption
;ShowHint
到true
;DoubleBuffered
到true
; 我一直想知道为什么默认值为'False'.对我来说,它只是看起来低技术和蹩脚,在我的新机器上,我没有注意到性能上的任何差异.
在旧机器,VNC,远程桌面或虚拟机中双重缓冲是否有问题?
你把它打开还是关闭?有什么建议?
我有一个面板上有一个轮盘赌轮,我需要双重缓冲面板,以便它停止闪烁.谁能帮我吗?
编辑:
是的,我试过了.
panel1.doublebuffered不存在,只有this.doublebuffered.而且我不需要缓冲表单,只需要Panel.
编辑二
为了防止讽刺评论和单行答案错过了重点:IFF它就像调用setDoubleBuffered(true)一样简单,那么如何才能访问当前的离线缓冲区以便我可以开始搞乱BufferedImage的底层像素数据缓冲区呢?
我花时间写了一段正在运行的代码(看起来也很有趣)所以我真的很感激答案实际上回答(多么令人震惊;)我的问题并解释这是什么/如何工作而不是单行和snarky评论 ;)
这是一段可以在JFrame上反弹的代码.我想知道可以用来转换这段代码的各种方法,以便它使用双缓冲.
请注意,我清除屏幕和重绘方块的方式并不是最有效的,但这实际上不是这个问题的关键(在某种程度上,为了这个例子它更好,它有点慢).
基本上,我需要不断修改BufferedImage中的很多像素(因为有某种动画),我不希望看到由于屏幕上的单缓冲而产生的视觉伪像.
我有一个JLabel,其Icon是一个包装BufferedImage的ImageIcon.我想修改那个BufferedImage.
必须做什么才能使其成为双缓冲?
据我所知,当我在"图像2"上画画时,会以某种方式显示"图像1 ".但是,那么一旦我做借鉴"图像2",我该如何"迅速"替换"图像1"的"图像2"?
这是我应该手动做的事情,比如说,自己交换JLabel的ImageIcon吗?
我应该总是绘制相同的BufferedImage,然后在JLabel的ImageIcon的BufferedImage中快速'blit'的BufferedImage像素?(我猜不是,我不知道我怎么能用显示器的"垂直空白线"[或平板屏幕中的等效物]"同步"这个:我的意思是'同步'而不会干扰显示器本身刷新它的时刻像素,以防止剪切]).
"重漆"订单怎么样?我想我自己触发这些吗?哪个/什么时候应该调用repaint()或其他什么?
最重要的要求是我应该直接在图像的像素数据缓冲区中修改像素.
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
public class DemosDoubleBuffering extends JFrame {
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
int xs = 3;
int ys = xs;
int x = 0;
int y = 0;
final int r …
Run Code Online (Sandbox Code Playgroud) 我们在DataGridViews中遇到了性能问题,其中重绘速度非常慢并且找到了解决方案这里创建一个派生类型并在控件上启用双缓冲.(由于DoubleBuffered属性受到保护,因此派生类型是必需的)
将DoubleBuffered属性设置为true似乎没有任何缺点.
ControlStyles.DoubleBuffer和ControlStyles.OptimizedDoubleBuffer有什么区别?
ControlStyles.DoubleBuffer未显示在Intellisense下拉列表中,而ControlStyles.OptimizedDoubleBuffer实际上已列出.
MSDN文档没有立即明确区别(至少对我来说).
我正在使用wxpython处理多平台应用程序,并且在绘制Panel时我在Windows上出现了闪烁问题.我曾经在鼠标运动事件中绘制缓冲区(wx.Bitmap),而我的OnPaint方法只是在线组成:
dc = wx.BufferedPaintDC(self, self.buffer)
Run Code Online (Sandbox Code Playgroud)
相当标准,但我仍然在Windows上有闪烁的问题,而一切都在Linux上运行良好.
我解决我的问题调用SetDoubleBuffered(True)
的__init__
方法.
奇怪的是,即使我不再使用BufferedPaintDC,现在一切正常.我更改了我的应用程序,以便所有绘图部分都在OnPaint方法中完成.我不使用缓冲区,直接在wx.PaintDC上完成绘图,完全没有闪烁问题.
所以我的问题是:BufferedPaintDC完全没用吗?或者以某种方式弃用?我是"WxPython in Action"(2006)一书的所有者,它甚至没有提到SetDoubleBuffered
如何使用C#(Windows窗体)启用控件的双缓冲?
我有一个面板控件,我正在绘制内容,也是一个所有者绘制的选项卡控件.两者都有闪烁,所以如何启用双缓冲?
doublebuffered ×10
winforms ×7
c# ×5
.net ×3
controls ×1
datagridview ×1
delphi ×1
delphi-2009 ×1
flicker ×1
gdi+ ×1
java ×1
ownerdrawn ×1
performance ×1
python ×1
swing ×1
wxpython ×1