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

问题描述

我有一个简单的应用程序,其面板包含2个标签(例如A和B)和一个由Delphi 2009创建的按钮C。 当我在面板区域内移动鼠标时,标签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.

解决方法

由于绘制是如何完成的,所以会发生闪烁。如果没有双缓冲区,将绘制(绘制)背景,然后绘制标签。因此,此时您仅看到背景,然后看到背景上方的标签。如果重复更新,则闪烁。

使用“双缓冲区”时,在不可见的缓冲区中绘制图形,然后在绘制完成时在屏幕上渲染该缓冲区。因此,您一次只能看到完整的图像,而不会闪烁。

要解决此问题,请使用自己发现的双重缓冲。

您还可以创建一个新组件,该组件将在其“绘制”过程中完成所有绘制工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...