2011-07-30 48 views
1

我期待创建类似于许多网站上看到的屏幕背景淡出效果与您要强调的内容不同的效果。在delphi中创建这种效果最好的方法是什么?使用Delphi调暗屏幕

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

谢谢。 Oscar

+1

灯箱使用叠加层,其图层位于显示的图层下方。 –

+0

这真是太棒了,但并没有回答我的问题:/ –

+0

由于我没有使用Delphi开发工具或语言,所以我不能告诉你,但这是JS库在实践中的工作原理;它是一个覆盖浏览器窗口的元素,元素的上方有一个更大的“z-index”元素,并显示内容。 –

回答

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 blend和transparency的组合,但是我没有任何代码来显示您。

如果我这样做了,我只是将我想不要变暗的东西浮起来,放在全屏无边界50%alpha形式之上,如下所示。

但是,正如您所看到的,屏幕不会变暗(屏幕亮度不会降低),它仅仅是我们已经完成了黑色的50%透明层,它已混合并使整个屏幕外观变暗。

enter image description here

+0

我已经走过了这条路线,效果很不好说。我想我应该更好地表达这个问题。我实际上试图以类似于windows xp关机屏幕的方式进行存档,看起来关闭窗口后面的整个区域是灰度并淡出。我只使用灯箱效果,因为更多的人会知道我在说什么。 –

+0

但是,我已决定走便宜的路线,只是做一个屏幕副本,并将其放置在我的主窗体上,它被设置为全屏显示。然后,我可以使用某种功能,将图像中不在我面板下方的部分应用到一个灰度过滤器。便宜是的,但它的工作原理。 –

+1

@Warren P:'“在主窗体中显示一个面板”将要求您将该内容移出主窗体,否则将区域从主窗体中剪除 - 可以同时使用透明度和alpha混合。这样,您可以在用于“调暗”屏幕的窗体中创建一个“洞”(例如,通过放置其颜色设置为窗体的TransparentColorValue颜色的面板),并且该区域不会变暗。 –

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但它使用不起作用。它似乎只适用于在设计时创建的表单。