如何减少Delphi中的闪烁?
这不仅是在这个论坛而且是所有德尔福论坛都是非常普遍和流行的问题,但我没有任何具体的解决方案,所以我再次问它。
我有一个非常简单的Delphi XE2项目,没有任何代码。当我运行应用程序时,它总是会产生闪烁DoubledBuffered:=true
和ParentDoubledBuffered:=true
。
以下是.pas File
的代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.Buttons;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
这是我.dfm File
的代码:
object Form1: TForm1
Left = 0
Top = 0
AlphaBlend = True
AlphaBlendValue = 230
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Form1'
ClientHeight = 300
ClientWidth = 600
Color = clWhite
DoubleBuffered = True
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
GlassFrame.Enabled = True
GlassFrame.SheetOfGlass = True
OldCreateOrder = False
Position = poDesktopCenter
Visible = True
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 20
Top = 74
Width = 160
Height = 13
AutoSize = False
Caption = 'Label1'
end
object Label2: TLabel
Left = 20
Top = 124
Width = 160
Height = 13
AutoSize = False
Caption = 'Label2'
end
object Edit1: TEdit
Left = 200
Top = 70
Width = 360
Height = 21
Alignment = taCenter
AutoSize = False
TabOrder = 0
Text = 'Edit1'
end
object Edit2: TEdit
Left = 200
Top = 120
Width = 360
Height = 21
Alignment = taCenter
AutoSize = False
TabOrder = 1
Text = 'Edit2'
end
object BitBtn1: TBitBtn
Left = 200
Top = 224
Width = 75
Height = 25
Caption = 'BitBtn1'
ParentDoubleBuffered = True
TabOrder = 2
end
object BitBtn2: TBitBtn
Left = 485
Top = 224
Width = 75
Height = 25
Caption = 'BitBtn2'
ParentDoubleBuffered = True
TabOrder = 3
end
end
我发现在Delphi
.exe File
中创建了很多应用程序。
我在PE Explorer
看到OnShow
,我发现所有者已定义Edit
个事件。
我还观察到另一个主要区别,当我双击应用程序时,我的PC中显示的表单需要比我的应用程序更多的时间,即在双击应用程序之后显示表单之前有比我更多的延迟。
另一件事是,首先Form Background
区域在闪烁时的第一瞬间变为黑色,有时也Timer
。在这里提出问题之前,我已经多次观察过很多次。请不要采取其他方式,因为我是一个学习者,没有像其他人一样可能会这样做。
以前,我使用Form.Create Event
作为Timer
,现在有一天,我对{{1}}不感兴趣。
请提供一些示例代码。
答案 0 :(得分:3)
好的,让我们看看这是否符合你的要求:
DwmSetWindowAttribute
来禁用主窗体的窗口转换。第3点需要更多细节。您需要窗口句柄才能执行此操作。您必须等到VCL创建窗口。因此,请在表单类中添加一个重写的CreateWnd
。
procedure CreateWnd; override;
并按照以下方式实施:
procedure TForm1.CreateWnd;
var
dwAttribute: DWORD;
begin
inherited;
dwAttribute := DWORD(True);
DwmSetWindowAttribute(WindowHandle, DWMWA_TRANSITIONS_FORCEDISABLED,
@dwAttribute, SizeOf(dwAttribute));
end;
您需要在Winapi.Dwmapi
条款中添加uses
。
现在,当您启动应用程序时,窗口会立即显示。抑制启动过渡意味着我们在最终意识到之前不再看到窗口显示错误的背景。
现在,如果你非常渴望进行alpha混合,那么我认为你可能遇到麻烦了。当我启用玻璃板和alpha混合时,我会在悬停在窗口标题栏按钮上时看到奇怪的文物。我认为悬停效果不会影响你的alpha混音。