delphi - 用Delphi调暗屏幕

标签 delphi screen

我希望创建一种类似于许多网站上看到的灯箱效果的效果,其中屏幕背景淡出,而您想要强调的内容却不会淡出。在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 混合加透明度的组合,但我没有任何代码可以向你展示。

如果我这样做,我只会将我不想变暗的东西 float 在全屏无边框 50% Alpha 形式上方,如下所示。

但正如您所看到的,屏幕并没有变暗(屏幕亮度没有降低),这只是我们做了一个 50% 透明的黑色层,它融入并加深了整个屏幕外观。

enter image description here

关于delphi - 用Delphi调暗屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880651/

相关文章:

delphi - 如何处理代理授权

delphi - 在 livebindings CustomFormat 中使用 Format

delphi - 如何使 Delphi 控制面板小程序不为 -'legacy' ?

delphi - Delphi 11 可以使用 GIF 吗?

css - 更改屏幕尺寸时背景变小,div 相互重叠

delphi - Vista 中的文本转语音

android - 如何录制 Android 设备屏幕?

c++ - 错误 LNK2019 : unresolved external symbol __imp__EnumDisplayDevicesA@16 referenced in function "private: struct _DISPLAY_DEVICEA __thiscall

android - 在 Android 上处理同一类别的不同屏幕尺寸的最佳方法

android:覆盖来电屏幕