Delphi -2009表格面板中标签的闪烁问题

s3fp2yjn  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(182)

我有一个简单的应用程序,面板包含2个标签(如A和B)和一个按钮C,由 Delphi 2009创建。标签A将显示光标位置,当我移动鼠标在面板区域内。标签B只显示静态文本(标题不会在应用程序运行期间改变)

如果我在面板内移动鼠标,标签A将闪烁。

当我启用窗体的“双缓冲区”时,闪烁丢失。按钮C将演示如何启用/禁用“双缓冲区”属性
我想问:“为什么面板上的标签会闪烁?根本原因是什么?如何才能彻底解决这个问题?
下面是我的代码:

unit DemoFlicker;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  System.StrUtils,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    pnlCtr: TPanel;
    btnDoubleBuffer: TButton;
    lblName: TLabel;
    lblNumber: TLabel;
    procedure btnDoubleBufferClick(Sender: TObject);
    procedure pnlCtrMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FDoubleBuffer: Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnDoubleBufferClick(Sender: TObject);
begin
     FDoubleBuffer := not FDoubleBuffer;
     Self.DoubleBuffered := FDoubleBuffer;

     if FDoubleBuffer then
     begin
         btnDoubleBuffer.Caption := 'Not Apply Double Buffer';
     end
     else
     begin
         btnDoubleBuffer.Caption := 'Apply Double Buffer';
     end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    FDoubleBuffer := False;
    Self.DoubleBuffered := False;
end;

procedure TForm1.pnlCtrMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
    mousePos: string;
begin
    mousePos := Format('(X=%d, Y=%d)', [Mouse.CursorPos.X, Mouse.CursorPos.Y]);
    lblNumber.Caption := mousePos  ;
end;

end.
uajslkp6

uajslkp61#

闪烁的发生是因为绘制的方式。如果没有双缓冲,绘制背景(绘制),然后绘制标签。因此,在一瞬间,你只看到背景,然后你看到背景上方的标签。如果你重复更新,它闪烁。
当使用“双缓冲区”时,绘图是在一个不可见的缓冲区中完成的,然后当绘图完成时,缓冲区被呈现在屏幕上。所以你只会一次看到完整的图像,而不会闪烁。
要解决这个问题,请使用您自己发现的双缓冲。
您也可以创建一个新的组件,它在“绘制”程序中自己进行所有绘制。

bfnvny8b

bfnvny8b2#

我也遇到过同样的问题, Delphi 10.4
以这种方式设置封闭TPanel-

DoubleBuffered = True

ParentBackground = False

VCL的实现变得太复杂了,特别是自从引入了Themes之后,使得它的行为非常有缺陷和不可预测。

相关问题