私は、画面の背景が薄くなり、強調したい内容がない多くのウェブサイトに見られるライトボックス効果と同様の効果を作りたいと考えています。デルファイでこのような効果を生み出す最善の方法は何でしょうか?Delphiで画面を暗くする
私が強調したいコンテンツは、私のフォーム上にある可動パネルです。基本的には、そのパネルの直下にない画面のどの部分もフェードアウトするだけです。
ありがとうございました。 オスカー
私は、画面の背景が薄くなり、強調したい内容がない多くのウェブサイトに見られるライトボックス効果と同様の効果を作りたいと考えています。デルファイでこのような効果を生み出す最善の方法は何でしょうか?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.
ここで私はトップの上に表示しています境界線がありません第二の形式は、です。アルファブレンディングが有効になっておらず、フォームスタイルは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%透明層をやったことを単にだ(画面の明るさが減少しない)淡色表示されていません。
私はすでにそのルートを過ぎてしまっており、その影響は最小限に抑えるためには醜いです。私は質問をよりよく表現すべきだと思います。私が実際にシャットダウンウィンドウの背後にある領域全体がグレースケールで消えてしまうWindows XPシャットダウン画面のようなエフェクトを実現しようとしているのです。もっと多くの人が私が何を話しているか知っているので、私はライトボックス効果を使用しただけです。 –
しかし、私は安いルートに行き、スクリーンコピーを作成し、フルスクリーンを表示するように設定されたメインフォームに配置することに決めました。次に、私のパネルの下にない画像の部分に、geyscaleフィルタを適用する関数を使うことができます。安いはい、それは動作します。 –
@Warren P: ''あなたのメインフォームにパネルを表示する場合は、メインフォームからそのコンテンツを移動する必要があります。そうでなければ、メインフォームから領域を切り抜く必要があります。 ' - 透明とアルファブレンディング。そうすれば、画面の色を薄くする(たとえば、フォームのTransparentColorValue色に設定された色のパネルを配置するなど)ために使用されるフォームに「穴」を付けることができ、その領域は淡色表示されません。 –
私はオスカーと同じ必要があります。ネット上で検索したところ、ここに表示されているものが見つかりました。 これは動作するので、これを行うのに役立ちました。パネルの代わりにフォームで強調表示されているものを移動することができます。 私は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を作成しようとしたが、それ動作しません。デザイン時に作成されたフォームでのみ動作するようです。
ライトボックスは、レイヤーが表示されているレイヤーより下にあるオーバーレイを使用します。 –
わかりやすいですが、私の質問に答えることはできません:/ –
私はDelphiの開発ツールや言語を使用していないので、私はあなたには言いませんが、それは実際にJSライブラリがどのように動作するかです。これはブラウザウィンドウ上のオーバーレイで、表示するコンテンツの「上」に「z-index」が大きい要素があります。 –