如何减少Delphi中启用AlphaBlend的Form应用程序的闪烁?

时间:2013-09-13 16:00:55

标签: delphi

如何减少Delphi中的闪烁?

这不仅是在这个论坛而且是所有德尔福论坛都是非常普遍和流行的问题,但我没有任何具体的解决方案,所以我再次问它。

我有一个非常简单的Delphi XE2项目,没有任何代码。当我运行应用程序时,它总是会产生闪烁DoubledBuffered:=trueParentDoubledBuffered:=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}}不感兴趣。

请提供一些示例代码。

1 个答案:

答案 0 :(得分:3)

好的,让我们看看这是否符合你的要求:

  1. 从.dfm文件中删除所有双缓冲设置。
  2. 从.dfm文件中删除所有Alpha混合设置。我认为你使用的玻璃板胜过阿尔法混合物。
  3. 通过调用DwmSetWindowAttribute来禁用主窗体的窗口转换。
  4. 第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混音。