Delphi を使用してスクリーン セーバー プレビュー プログラムを開発する
企画・編集:中国ASP
---- Windows スクリーン セーバーの役割は誰もが知っていますが、新しいスクリーン セーバーはますます美しくなっています。win95 のデスクトップの右クリック メニューからプロパティを選択すると、モニター設定インターフェイスが表示されます。スクリーンセーバーを設定するタブです。
---- このページの画面には、win95 に付属のスクリーン セーバーを選択すると、この小さな「モニター」上でスクリーン セーバーが自動的に実行され、実行中の効果を直接確認できます。この機能により、スクリーン セーバーの選択が大幅に容易になります。これは、win95 のスクリーン セーバー用の新しいインターフェイスです。プレビュー機能です。
---- 新しくリリースされたスクリーン セーバーのほとんどは、現在このインターフェイスをサポートしています。
---- 誕生以来、同時に実行できるスクリーンセーバーは 1 つだけであり、複数の画面を同時に実行することはできませんでしたが、プレビュー インターフェイスの導入により、複数のスクリーン セーバーを同時にプレビューできるようになりました。この記事では、Delphi を使用してそのようなプログラムを開発する方法を紹介します。
---- 1. スクリーンセーバープレビューインターフェース
---- スクリーン セーバーのプレビュー インターフェイスは、コマンド ライン パラメーターをスクリーン セーバーに渡すことで非常に簡単に使用できます。
---- スクリーンセーバー.exe /p #####
---- ##### は、有効なウィンドウ ハンドルの 10 進表現です。
---- このウィンドウをプレビュー ウィンドウと呼ぶことができます。
----実際には、プレビュー インターフェイスをサポートするスクリーンセーバーは、プレビュー ウィンドウのサブウィンドウとして独自のウィンドウを作成して、プレビュー機能を実装します。
---- 2. 画面構成
---- プログラムのウィンドウは 3 つの部分に分かれており、逆さまの「ピン」の形をしています。左上の部分には使用可能なすべてのスクリーンセーバーがリストされ、右上の部分にはプレビューされたすべてのスクリーンセーバーがリストされます。もちろんプレビューウィンドウです。
---- Delphi で実装する場合、まずフォームに 2 つの TPanel コンポーネントを配置します。Panel1 は上に配置され、Panel2 はユーザー領域を埋めるように配置されます。次に、TFileListBox コンポーネントと TListBox コンポーネントをPanel1 に配置し、FileListBox1 は左に配置されます。 ListBox1 がユーザー領域を埋めます。
---- このように、FileListBox1 がスクリーン セーバー リスト、ListBox1 がプレビュー リスト、Panel2 がプレビュー ウィンドウになります。
---- 3. スクリーンセーバーの一覧を表示します。
---- FileListBox1 の Mask プロパティを、スクリーン セーバーの拡張子である '*.scr' に設定します。
---- FormCreate メソッドで FileListBox1.directory を Windows システム ディレクトリ GetSystemDirectory に設定します。
---- 4. スクリーンセーバーをプレビューします。
----FileListBox1DblClick メソッドでスクリーンセーバーを実行し、Panel2 のウィンドウ ハンドルに渡します。
---- WinExec(pchar(FileListBox1.FileName + ' /p ' + inttostr(Panel2.handle)), SW_Show);
----COOL!プログラムを実行してみてはいかがでしょうか?
---- 5. いくつかの新機能を追加します: 非表示/表示/閉じる。
----ListBox1 の更新に使用される 2 つの関数を追加しました。
関数 EnumPROc(
h : HWND;//子ウィンドウのハンドル
l : 整数// アプリケーション定義の値
): ブール値;stdcall;
変数
buf : 文字の配列[0..255];
始める
GetWindowText(h, buf, sizeof(buf)- 1);
iswindowvisible(h) の場合
Form1.ListBox1.items.add(' ' +strpas(buf) + ' : ' + inttostr(h))
それ以外
Form1.ListBox1.items.add('-' +strpas(buf) + ' : ' + inttostr(h));
結果 := true;
終わり;
プロシージャ TForm1.Fresh1;
始める
リストボックス1.クリア;
enumChildwindows(Panel2.handle,
TFNWndEnumProc(@enumproc), 0);
終わり;
---- ポップアップ メニュー Popupmenu1、3 つのメニュー項目「表示、非表示、閉じる」を追加し、ListBox1.popupmemu を Popupmenu1 にポイントします。
----Hideの処理機能は次のとおりです。
プロシージャ TForm1.Hide1Click(送信者: TObject);
変数
h : 整数。
s : 文字列;
始める
ListBox1.itemindex = -1 の場合は終了します。
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
ShowWindow(h, SW_HIDE);
新鮮1;
終わり;
Show のハンドラー関数は次のとおりです。
プロシージャ TForm1.Show1Click(送信者: TObject);
変数
h : 整数。
s : 文字列;
始める
ListBox1.itemindex = -1 の場合は終了します。
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
ShowWindow(h, SW_SHOW);
新鮮1;
終わり;
Close のハンドラー関数は次のとおりです。
プロシージャ TForm1.Close1Click(送信者: TObject);
変数
h : 整数。
s : 文字列;
始める
ListBox1.itemindex = -1 の場合は終了します。
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
PostMessage(h, WM_QUIT, 0, 0);
新鮮1;
終わり;
---- このプログラムは Delphi 3.0 でデバッグされており、Delphi 1.0 / 2.0 でコンパイルできるはずです。
----完全な手順は次のとおりです。
ユニットユニット1;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、クラス、グラフィックス、コントロール、フォーム、ダイアログ、StdCtrls、FileCtrl、ExtCtrls、メニュー。
タイプ
TForm1 = クラス(TForm)
パネル1: Tパネル;
パネル2: Tパネル;
FileListBox1: TFileListBox;
リストボックス1: Tリストボックス;
ポップアップメニュー 1: TPopupMenu;
Hide1: TMenuItem;
表示 1: TMenuItem;
閉じる 1: TMenuItem;
プロシージャ FormCreate(Sender: TObject);
プロシージャ FileListBox1DblClick(送信者: TObject);
プロシージャ Hide1Click(送信者: TObject);
プロシージャ Show1Click(送信者: TObject);
プロシージャ Close1Click(送信者: TObject);
プライベート
{プライベート宣言}
公共
{公的宣言}
プロシージャ Fresh1;
終わり;
変数
フォーム1: TForm1;
実装
{$R *.DFM}
関数 EnumProc(
h : HWND;//子ウィンドウのハンドル
l : 整数// アプリケーション定義の値
): ブール値;stdcall;
var buf: char の array[0..255];
始める
GetWindowText(h, buf, sizeof(buf)- 1);
iswindowvisible(h) の場合
Form1.ListBox1.items.add(' ' +strpas(buf) + ' : ' + inttostr(h))
それ以外
Form1.ListBox1.items.add('-' +strpas(buf) + ' : ' + inttostr(h));
結果 := true;
終わり;
プロシージャ TForm1.Fresh1;
始める
リストボックス1.クリア;
enumChildwindows(Panel2.handle, TFNWndEnumProc(@enumproc), 0);
終わり;
プロシージャ TForm1.FormCreate(送信者: TObject);
var buf: char の配列 [0..256];
始める
GetSystemDirectory(buf, sizeof(buf) - 1);
FileListBox1.directory := strpas(buf);
ListBox1.popupmenu := Popupmenu1;
終わり;
プロシージャ TForm1.FileListBox1DblClick(送信者: TObject);
始める
WinExec(pchar(FileListBox1.FileName + ' /p ' + inttostr(Panel2.handle)), SW_Show);
新鮮1;
終わり;
プロシージャ TForm1.Hide1Click(送信者: TObject);
変数
h : 整数。
s : 文字列;
始める
ListBox1.itemindex = -1 の場合は終了します。
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
ShowWindow(h, SW_HIDE);
新鮮1;
終わり;
プロシージャ TForm1.Show1Click(送信者: TObject);
変数
h : 整数。
s : 文字列;
始める
ListBox1.itemindex = -1 の場合は終了します。
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
ShowWindow(h, SW_SHOW);
新鮮1;
終わり;
プロシージャ TForm1.Close1Click(送信者: TObject);
変数
h : 整数。
s : 文字列;
始める
ListBox1.itemindex = -1 の場合は終了します。
s := Listbox1.items[ListBox1.itemindex];
h := strtoint(copy(s, pos(':', s) + 1, length(s)));
PostMessage(h, WM_QUIT, 0, 0);
新鮮1;
終わり;
終わり。
著作権 © 上海 Jusheng Computer System Engineering Co., Ltd. 1999-2000、全著作権所有