Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-2009表格面板中标签的闪烁问题_Delphi_Label_Panel_Delphi 2009_Flicker - Fatal编程技术网

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

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

我有一个带有面板的简单应用程序,包含2个标签(例如a&B)和一个由Delphi2009创建的按钮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.

由于图形的绘制方式,会发生闪烁。如果没有双缓冲区,则绘制(绘制)背景,然后绘制标签。所以在某个时刻,你只看到背景,然后你看到背景上方的标签。如果重复更新,它会闪烁

使用“双缓冲区”时,绘图在不可见的缓冲区中完成,绘图完成后,缓冲区在屏幕上呈现。因此,您一次只能看到完整的图像,并且不会闪烁

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


您还可以创建一个新组件,该组件在绘制过程中自行绘制所有图形。

由于绘制方式的不同,会出现闪烁。如果没有双缓冲区,则绘制(绘制)背景,然后绘制标签。所以在某个时刻,你只看到背景,然后你看到背景上方的标签。如果重复更新,它会闪烁

使用“双缓冲区”时,绘图在不可见的缓冲区中完成,绘图完成后,缓冲区在屏幕上呈现。因此,您一次只能看到完整的图像,并且不会闪烁

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


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

感谢您的快速回答。因此,根本原因是您上面解释的绘图机制。但我仍然有一个困惑,那个就是若我不再使用面板,我的意思是把2个标签(a&B)直接放在表单上,不使用双缓冲->并没有闪烁。我不知道为什么这两种情况会有不同的现象。请回答我(对不起,我是一个德尔菲初学者)我不认为这就是关于这个问题的全部内容。没有双缓冲的无闪烁绘图是完全可行的。而且也很理想。@NamVu一个TForm(实际上是TCustomForm)和一个TPanel(实际上是TCustomPanel)有完全不同的绘画程序。谢谢你的快速回答。因此,根本原因是您上面解释的绘图机制。但我仍然有一个困惑,那个就是若我不再使用面板,我的意思是把2个标签(a&B)直接放在表单上,不使用双缓冲->并没有闪烁。我不知道为什么这两种情况会有不同的现象。请回答我(对不起,我是一个德尔菲初学者)我不认为这就是关于这个问题的全部内容。没有双缓冲的无闪烁绘图是完全可行的。而且也很理想。@NamVu一个TForm(实际上是一个TCustomForm)和一个TPanel(实际上是一个TCustomPanel)有完全不同的绘制例程。