Delphi-2009表格面板中标签的闪烁问题
我有一个带有面板的简单应用程序,包含2个标签(例如a&B)和一个由Delphi2009创建的按钮C。 当我在面板区域内移动鼠标时,标签A将显示光标位置。标签B仅显示静态文本(标题在应用程序运行期间不会更改) 如果我在面板内移动鼠标,标签A将闪烁。 当我启用窗体的“双缓冲区”时,闪烁消失。按钮C将演示如何启用/禁用“双缓冲区”属性 我想问“为什么面板中的标签会闪烁?根本原因是什么?我们怎样才能彻底解决这个问题?' 这是我的密码:Delphi-2009表格面板中标签的闪烁问题,delphi,label,panel,delphi-2009,flicker,Delphi,Label,Panel,Delphi 2009,Flicker,我有一个带有面板的简单应用程序,包含2个标签(例如a&B)和一个由Delphi2009创建的按钮C。 当我在面板区域内移动鼠标时,标签A将显示光标位置。标签B仅显示静态文本(标题在应用程序运行期间不会更改) 如果我在面板内移动鼠标,标签A将闪烁。 当我启用窗体的“双缓冲区”时,闪烁消失。按钮C将演示如何启用/禁用“双缓冲区”属性 我想问“为什么面板中的标签会闪烁?根本原因是什么?我们怎样才能彻底解决这个问题?' 这是我的密码: unit DemoFlicker; interface uses
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.
由于图形的绘制方式,会发生闪烁。如果没有双缓冲区,则绘制(绘制)背景,然后绘制标签。所以在某个时刻,你只看到背景,然后你看到背景上方的标签。如果重复更新,它会闪烁 使用“双缓冲区”时,绘图在不可见的缓冲区中完成,绘图完成后,缓冲区在屏幕上呈现。因此,您一次只能看到完整的图像,并且不会闪烁 要解决此问题,请使用自己发现的双缓冲
您还可以创建一个新组件,该组件在绘制过程中自行绘制所有图形。由于绘制方式的不同,会出现闪烁。如果没有双缓冲区,则绘制(绘制)背景,然后绘制标签。所以在某个时刻,你只看到背景,然后你看到背景上方的标签。如果重复更新,它会闪烁 使用“双缓冲区”时,绘图在不可见的缓冲区中完成,绘图完成后,缓冲区在屏幕上呈现。因此,您一次只能看到完整的图像,并且不会闪烁 要解决此问题,请使用自己发现的双缓冲
您还可以创建一个新组件,该组件在其绘制过程中完成所有绘制工作。感谢您的快速回答。因此,根本原因是您上面解释的绘图机制。但我仍然有一个困惑,那个就是若我不再使用面板,我的意思是把2个标签(a&B)直接放在表单上,不使用双缓冲->并没有闪烁。我不知道为什么这两种情况会有不同的现象。请回答我(对不起,我是一个德尔菲初学者)我不认为这就是关于这个问题的全部内容。没有双缓冲的无闪烁绘图是完全可行的。而且也很理想。@NamVu一个TForm(实际上是TCustomForm)和一个TPanel(实际上是TCustomPanel)有完全不同的绘画程序。谢谢你的快速回答。因此,根本原因是您上面解释的绘图机制。但我仍然有一个困惑,那个就是若我不再使用面板,我的意思是把2个标签(a&B)直接放在表单上,不使用双缓冲->并没有闪烁。我不知道为什么这两种情况会有不同的现象。请回答我(对不起,我是一个德尔菲初学者)我不认为这就是关于这个问题的全部内容。没有双缓冲的无闪烁绘图是完全可行的。而且也很理想。@NamVu一个TForm(实际上是一个TCustomForm)和一个TPanel(实际上是一个TCustomPanel)有完全不同的绘制例程。