2011-07-30 76 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但它使用不起作用。它似乎只適用於在設計時創建的表單。