2011-07-30 14 views
1

私は、画面の背景が薄くなり、強調したい内容がない多くのウェブサイトに見られるライトボックス効果と同様の効果を作りたいと考えています。デルファイでこのような効果を生み出す最善の方法は何でしょうか?Delphiで画面を暗くする

私が強調したいコンテンツは、私のフォーム上にある可動パネルです。基本的には、そのパネルの直下にない画面のどの部分もフェードアウトするだけです。

ありがとうございました。 オスカー

+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. 

ここで私はトップの上に表示しています境界線がありません第二の形式は、です。アルファブレンディングが有効になっておらず、フォームスタイルは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. 

あなたのメインフォームからそのコンテンツを移動するか、またはフォーム1から領域を切り取るか、アルファブレンドと透明度の組み合わせを使用しますが、私はそれらを表示するコードはありません。

私が行っていた場合、以下のように、全画面ボーダーレスの50%のアルファフォームの上に、ぼかさないことを浮かべます。

しかし、あなたが見るように、画面には、それは我々がでブレンドし、画面全体の外観を暗くしている黒の50%透明層をやったことを単にだ(画面の明るさが減少しない)淡色表示されていません。

enter image description here

+0

私はすでにそのルートを過ぎてしまっており、その影響は最小限に抑えるためには醜いです。私は質問をよりよく表現すべきだと思います。私が実際にシャットダウンウィンドウの背後にある領域全体がグレースケールで消えてしまうWindows XPシャットダウン画面のようなエフェクトを実現しようとしているのです。もっと多くの人が私が何を話しているか知っているので、私はライトボックス効果を使用しただけです。 –

+0

しかし、私は安いルートに行き、スクリーンコピーを作成し、フルスクリーンを表示するように設定されたメインフォームに配置することに決めました。次に、私のパネルの下にない画像の部分に、geyscaleフィルタを適用する関数を使うことができます。安いはい、それは動作します。 –

+1

@Warren P: ''あなたのメインフォームにパネルを表示する場合は、メインフォームからそのコンテンツを移動する必要があります。そうでなければ、メインフォームから領域を切り抜く必要があります。 ' - 透明とアルファブレンディング。そうすれば、画面の色を薄くする(たとえば、フォームのTransparentColorValue色に設定された色のパネルを配置するなど)ために使用されるフォームに「穴」を付けることができ、その領域は淡色表示されません。 –

0

私はオスカーと同じ必要があります。ネット上で検索したところ、ここに表示されているものが見つかりました。 これは動作するので、これを行うのに役立ちました。パネルの代わりにフォームで強調表示されているものを移動することができます。 私は2つのフォームを使用します。最初のものは「フェーダー」として使用され、2つ目はダイアログボックスとしての使用です。 まず

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; 

を私は、実行時にフォームを作成、このスキーマを再現AN TFormDlgBoxが所有作るとTFormFadedを作成しようとしたが、それ動作しません。デザイン時に作成されたフォームでのみ動作するようです。

関連する問題