如何消除TSpeedButton控件的图片闪烁问题?
问题复现步骤
- 在新VCL窗体中添加
TPanel,设置Align = alClient。 - 在面板上添加
TSpeedButton,为其Glyph属性分配一张bmp图片。(可选但效果更明显:设置Flat = True) - 运行程序,拖动窗体右下角调整大小,
TSpeedButton中的图片会出现闪烁。
尝试过无效的方案
- 该控件没有
DoubleBuffered属性 - 无法设置
WS_EX_COMPOSITED,因为它是TGraphicControl而非TWinControl - 不会接收
WM_ERASEBKGND消息
说明:实际使用的是
TPngSpeedButton,但问题根源在于TSpeedButton,故以此为例。
可行解决方案
方案1:给父面板启用双缓冲
虽然TSpeedButton本身没有双缓冲属性,但它的绘制完全依赖父控件的画布。给父TPanel开启双缓冲,能大幅减少整体重绘时的闪烁。代码设置方式:
Panel1.DoubleBuffered := True;
如果是较新的Delphi版本,也可以直接在DFM文件中给TPanel添加DoubleBuffered = True属性。
方案2:自定义优化版TSpeedButton
重写TSpeedButton的Paint方法,避免不必要的背景擦除操作,直接基于父控件背景绘制:
type TNoFlashSpeedButton = class(TSpeedButton) protected procedure Paint; override; end; procedure TNoFlashSpeedButton.Paint; var CanvasState: TCanvasSaveState; begin CanvasState := Canvas.Save; try // Flat模式下先填充与父控件一致的背景,避免闪烁 if Flat then begin Canvas.Brush.Color := Parent.Color; Canvas.FillRect(ClientRect); end; // 执行原有绘制逻辑 inherited Paint; finally Canvas.Restore(CanvasState); end; end;
使用这个自定义控件替代原生TSpeedButton,能从绘制根源减少闪烁。
方案3:用双缓冲Panel包裹按钮
如果不想修改控件代码,可以给每个TSpeedButton套一个小型TPanel:
- 创建一个小
TPanel,设置Align = alClient、DoubleBuffered = True、BorderStyle = bsNone - 将
TSpeedButton放在这个小Panel内,设置Align = alClient - 把这个组合控件放到原面板中
小Panel的双缓冲会处理按钮的绘制缓冲,从而消除闪烁。
补充:问题复现DFM代码
object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 337 ClientWidth = 635 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Panel1: TPanel Left = 0 Top = 0 Width = 635 Height = 337 Align = alClient Caption = 'Panel1' TabOrder = 0 object SpeedButton1: TSpeedButton Left = 64 Top = 56 Width = 32 Height = 32 Flat = True Glyph.Data = { 360C0000424D360C000000000000360000002800000020000000200000000100 180000000000000C000000000000000000000000000000000000FFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CED241C ED241CED241CED241CED241CED241CED241CED241CED241CED241CED241CED24 1CED241CED241CED241CED241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CED241C ED241CED241CED241CED241CED241CED241CED241CED241CED241CED241CED24 1CED241CED241CED241CED241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CED241C ED241CED241CED241CED241CED241CED241CED241CED241CED241CED241CED24 1CED241CED241CED241CED241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CED241C ED241CED241CED241CED241CED241CED241CED241CED241CED241CED241CED24 1CED241CED241CED241CED241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CED241C ED241CED241CED241CED241CED241CED241CED241CED241CED241CED241CED24 1CED241CED241CED241CED241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFF241CED241CED241CED241CED241CEDCC483FCC483F CC483FCC483FCC483FCC483FCC483F } end end end
内容的提问来源于stack exchange,提问作者CodeX
相关产品推荐
相关产品推荐

