我希望创建一个类似于许多网站上看到的灯箱效果的效果,其中屏幕的背景淡出,而您想要强调的内容则没有。在delphi中创建这样一个效果的最佳方法是什么?
在这种情况下,我想强调的内容是位于我的表单上的可移动面板,基本上我想做的就是淡出屏幕上不直接位于该面板下的任何区域。
感谢。 奥斯卡
答案 0 :(得分:9)
创建新表单并将此代码添加到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%透明的黑色层,它混入并使整个屏幕外观变暗。
答案 1 :(得分:0)
我和奥斯卡一样需要。经过网上搜索后,我发现了这里显示的内容。 它帮助我做到了这一点,因为它有效。您可以移动窗体中强调的内容而不是面板。 我用两种形式。第一个用作“推子”,第二个用作对话框。 第一
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,但它不起作用。它似乎只适用于在设计时创建的表单。