繁体   English   中英

用Delphi调暗屏幕

[英]Dimming the screen with Delphi

我正在寻找一种类似于在许多网站上看到的灯箱效果的效果,在该网站上,屏幕的背景逐渐淡出,而您要强调的内容却没有。 在delphi中创建这种效果的最佳方法是什么?

在这种情况下,我要强调的内容是位于窗体上的可移动面板,基本上我要做的就是淡出屏幕上不直接位于该面板下方的任何区域。

谢谢。 奥斯卡奖

创建一个新窗体并将此代码添加到FormCreate方法。 您也可以使用属性检查器更改属性,但是我选择使用代码向您显示相关属性:

unit Unit1;
// This is a full screen partially transparent black form.
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClick(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation
uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  BorderStyle := bsNone;
  Self.WindowState := wsMaximized;
  AlphaBlend := true;
  Alphablendvalue := 127;
  Color := clBlack;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  Close;
end;

end.

这是第二个没有边框的表格,我在上方显示。 它没有启用Alpha混合,并且表单样式应为fsStayOnTop ,否则,您应使用ParentWindow属性(在支持该功能的Delphi版本上)。

unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    procedure FormDeactivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormActivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FAutoDeactivate: Boolean;
    FCounter: Integer;
    procedure WMUser1(var Message:TMessage); message WM_USER+1;
  public
    property AutoDeactivate:Boolean read FAutoDeactivate write FAutoDeactivate;
  end;

var
  Form2: TForm2;

implementation
uses Unit1;

{$R *.dfm}

procedure TForm2.FormDeactivate(Sender: TObject);
begin
  if Self.Visible and FAutoDeactivate then
  begin
    FAutoDeactivate := false;

    Form1.Close;
  end;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.Close;
end;

procedure TForm2.FormActivate(Sender: TObject);
begin
  PostMessage(Self.Handle, WM_USER+1, 0, 0);
end;

procedure TForm2.WMUser1(var Message: TMessage);
begin
 FAutoDeactivate := true;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  BorderStyle := bsNone;
  Color := clWhite;
  FormStyle := fsStayOnTop; // or set parent 
end;

end.

这解决了如何使整个屏幕“变暗”,然后在该“变暗的区域”上显示某些内容,但是您所描述的“在主窗体中显示面板”将要求您将该内容移出您的主要形式,或者从form1剪切区域,或者结合使用alpha混合和透明度,但是我没有任何代码可以向您显示。

如果我这样做了,我会把我不想变暗的东西浮动在全屏无边界50%Alpha表格上方,如下所示。

但是,正如您所见,屏幕并没有变暗(屏幕亮度没有降低),仅仅是我们完成了50%的黑色透明层,使整个屏幕外观变得暗淡。

在此处输入图片说明

我和奥斯卡一样有需求。 经过网上搜索后,我发现这里显示了什么。 因为它有效,它帮助了我做到这一点。 您可以移动表单而不是面板中强调的内容。 我使用两种形式。 第一个用作“推子”,第二个用作对话框。 第一

unit uFormFaded;

interface

uses
   ...

type
  TFormFaded = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  FormFaded: TFormFaded;

implementation

{$R *.dfm}

procedure TFormFaded.FormCreate(Sender: TObject); 
begin
  Align := alClient;
  AlphaBlend := true;
  AlphaBlendValue := 100;
  BorderStyle := bsNone;
  Color := clBlack;
  Enabled := false;
  FormStyle := fsStayOnTop;
end;

end.

第二

unit UFormDlgBox;

interface

uses
   ...

type
  TFormDlgBox = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  FormDlgBox: TFormDlgBox;

implementation

{$R *.dfm}

uses uFormFaded;

procedure TFormDlgBox.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FormFaded.Close;
end;

procedure TFormDlgBox.FormShow(Sender: TObject);
begin
  FormFaded.Show;
end;

end.

使用

FormDlgBox.ShowModal;

我试图重现此模式,在运行时创建表单,使TFormDlgBox拥有并创建TFormFaded,但它不起作用。 似乎它仅适用于在设计时创建的表单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM