Tag: doublebuffered

尽管双重缓冲,但自动收报机仍在闪烁

有没有人知道如何摆脱闪烁? 我研究了SO,网络,并试了很多不同的东西,比如把TickerControl放到双缓冲面板和双缓冲时没有在OnPaint()中绘图:为什么它不起作用? 除了许多其他的东西。 它仍然闪烁,不是每次重复,而是每秒几次。 此外,即使在OnPaint中删除“g.Clear(BackColor)”之后,仍然必须清除背景,因为文本继续可读地滚动。 这里是我的TickerControl类的相关部分: class TickerControl : Control { private static readonly StringFormat stringFormat = new StringFormat(StringFormatFlags.NoWrap); private const int padding = 40; private const int scrollSleep = 10; private const int scrollAdvancePixels = 1; private float textWidth; private float currentX; private static readonly Timer scrollTimer = new Timer(); public TickerControl() { this.SetStyle(ControlStyles.UserPaint […]

双缓冲ListBox

我有一个CheckedListBox(WinForms)控件(它inheritance自ListBox; googling显示问题在于ListBox),它被锚定到其表单的所有四个边。 调整窗体大小时,ListBox有一个丑陋的闪烁。 我尝试inheritanceCheckedListBox并在ctor DoubleBuffered设置为true (此技术适用于其他控件,包括ListView和DataGridView),但它没有任何效果。 我尝试将WS_EX_COMPOSITED样式添加到CreateParams ,这有所帮助,但使表单resize更慢。 有没有其他方法可以防止这种闪烁?

DoubleBuffered设置为true时覆盖OnPaint的问题

我创建了一个派生自Panel的自定义控件。 我用它来使用BackgroundImage属性显示一个Image。 我重写OnClick方法并将isSelected设置为true然后调用Invalidate方法并在覆盖的OnPaint中绘制一个矩形。 一切都很顺利,直到我将DoubleBuffered设置为true。 绘制矩形然后将其删除,我无法理解为什么会发生这种情况。 public CustomControl() : base() { base.DoubleBuffered = true; base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true); } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); PaintSelection(); } private void PaintSelection() { if (isSelected) { Graphics graphics = CreateGraphics(); graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width – 1, DisplayRectangle.Height – 1); } }

使用DoubleBuffering和FormBorderStyle.None在Windows10上重绘问题

我有一个Windows窗体项目的问题,我只能在Windows 10机器上重现(在Windows 7上它确实有效)。 我认为我可以隔离问题的来源,即,如果我打开双缓冲并将FormBorderStyle设置为None ,那么如果我在事件处理程序中调整窗体大小,则背景的部分和一些控件不会被重绘。 它也是如此,有时它起作用(从五点开始一次)。 没有重新绘制它看起来如此(通常有点不同): 它应该看起来像: 要重现这个问题,只需将几个控件添加到表单中(可能数量也很重要),通过覆盖CreateParams切换双缓冲, FormBorderStyle=None (使用另一种边框样式!)。 代码背后: public partial class Form1 : Form { public Form1() { InitializeComponent(); } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED return cp; } } private bool small = true; private void button1_Click(object sender, […]

如何使用C#(Windows窗体)启用控件的双缓冲?

如何使用C#(Windows窗体)启用控件的双缓冲? 我有一个面板控件,我正在绘制内容,也是一个所有者绘制的选项卡控件。 两者都有闪烁,所以如何启用双缓冲?

Winforms:SuspendLayout / ResumeLayout是不够的?

我有一些库“自定义控件”。 基本上我们有自己的按钮,更圆的角落面板,以及一些带有一些定制油漆的combobox。 尽管OnPaint方法中有“数学”,但控件非常标准。 大多数情况下,我们所做的只是绘制圆角并为背景添加渐变。 我们使用GDI +来实现这一切。 这些控件都可以(根据我们的客户非常好看),但是尽管有DoubleBuffer,你可以看到一些重绘,特别是在同一表格上有20个++按钮时(例如)。 在表单加载时,您会看到绘制的按钮…这很烦人。 我很确定我们的按钮不是地球上最快的东西,但我的问题是:如果双缓冲区“打开”,那么不应该在后台进行所有重绘,而Windows子系统应该“立即”显示结果吗? 另一方面,如果有“复杂”的foreach循环将创建标签,将它们添加到面板(双缓冲)并更改其属性,如果我们在循环之前挂起面板并在循环时恢复面板布局结束,不应该所有这些控件(标签和按钮)“几乎立即”出现? 这不会发生这种情况,您可以看到面板被填充。 知道为什么不发生这种情况吗? 我知道很难在没有示例代码的情况下进行评估,但这也难以复制。 我可以用相机制作一个video,但相信我这个,它不是很快:)

如何在C#中对Panel进行双重缓冲?

我有一个面板上有一个轮盘赌轮,我需要双重缓冲面板,以便它停止闪烁。 谁能帮我吗? 〜T-福克斯 编辑: 是的,我试过了。 panel1.doublebuffered不存在,只有this.doublebuffered。 我不需要缓冲表格,只需要面板。