多くの人は、Delphi が RAD ツールであると考えています。学生時代は Delphi に偏見を持っていましたが、今では、Delphi はより広範囲の領域をカバーし、より多くの問題に直面しています。徐々に自分なりの視点を身につけていきました。実際、Delphi は Object Pascal 言語に基づく開発ツールです。これは、Delphi が本質的に言語ツールであり、真のオブジェクト指向であることを意味します。以下に示す例は、Delphi で実装されたトレイ アプレットです。プログラムは短く簡潔であり、重要な部分を詳細に説明します。 Hou Junjie 氏が MFC を一層ずつ剥がしているように、今日も私は「牛を料理する」必要があります。
Delphi では、システム プログラミングに関しては、例外なく API 関数を呼び出す必要があります。ShellAPI.pas ユニットで使用する API 関数のプロトタイプが存在します。
実践的な演習:
1つ。新しいアプリケーションを作成します: [ファイル] -> [新しいアプリケーション] インターフェイス セクションでメッセージ定数を定義します: const WM_NID=WM_USER+1000; システムは、メッセージが WM_USER から始まるユーザー向けにカスタマイズされることを規定します。
二。グローバル変数を定義します: NotifyIcon:TNotifyIconData NotifyIcon は非常に重要な変数であり、プログラム全体は基本的にこの変数を中心に展開します。 TNotifyIconData はレコード タイプです。Ctrl キーを押しながら TNotifyIconData をダブルクリックして、ShellAPI.pas ユニットに入ります。 (注: Delphi では、これはソース コードを分析する非常に良い方法です。ソース コード自体がすべてを物語っています。プログラムの背後にある内部ストーリーを知りたい場合は、ソース コードを分析するのが最善の方法です。)すると、次のような代入ステートメントが表示されます。
TNotifyIconData = TNotifyIconDataA、この意味は非常に明白です。つまり、TNotifyIconData と TNotifyIconDataA は同じデータ型であり、以下のようになります。
TNotifyIconDataA = _NOTIFYICONDATAA、意味は前と同じです。下を見てください。
タイプ
_NOTIFYICONDATAA = レコード
cbSize: DWord;
Wnd: HWND;
uID: UINT;
uFlags: UINT;
uCallbackMessage: UINT;
hアイコン: HICON;
szTip: AnsiChar の配列 [0..63];
終わり;
これはまさに「ずっと呼ばれて出てきたのに、顔を半分隠したまま琵琶を持ったまま」です。これで、先ほど定義したグローバル変数 NotifyIcon が、実際には 7 つのコンポーネントを含むレコード型変数であることがわかりました。これは、C/C++ の構造体変数に相当します (C/C++ プログラマはよく知っているはずです)。レコードタイプの 7 つの部分の機能を 1 つずつ説明しましょう。
1> cbSize は、定義した NotifyIcon 変数のサイズです。これは、熟練した C/C++ プログラマであれば、SizeOf(TNotifyIconData) を使用して取得できます。 C/C++ では、構造体変数にメモリを割り当てる場合は常に、SizeOf(Struct type) を使用して、そのような構造体変数を格納するために必要なメモリ量を知る必要があります。
2> Wnd はハンドルです。トレイ プログラムによって生成されたメッセージでどのフォームを処理するか? Wnd がそのフォームを指すようにします。
たとえば、タスク バーの小さなトレイ アイコンをクリックしてフォームを「表示」と「非表示」の間で切り替える場合は、Wnd をメイン フォームにポイントします。
3> uID: 複数のトレイ アプレットを作成したい場合、それらを区別するにはどうすればよいですか?このID番号で区別されます。
3> uFlags はフラグ ビットで、現在作成されているトレイ プログラムのプロパティを示します。
NIF_ICON は、現在設定されているアイコン (つまり、hIcon の値) が有効であることを示します
NIF_MESSAGE は、現在設定されているシステム メッセージ (つまり、uCallBackMessage の値) が有効であることを示します
NIF_TIP は、現在設定されているチップバー (つまり、szTip の値) が有効であることを示します。
4> uCallBackMessage これは 7 つの部分の中で最も重要です。ここでコールバック メッセージを指定します。つまり、トレイ アイコンをクリックまたは右クリックすると、uCallBackMessage で定義されたメッセージ名が Wnd が指すフォームに送信され、メッセージ名を定義します。このメッセージを処理するには、プログラム内のメッセージ出力関数を使用します。このようにして、Windows に関連する一連のメッセージ全体が処理されます。
6> hIcon はトレイ アイコンのハンドルであり、このハンドルに基づいてアイコンを追加、変更、削除できます。
7> szTip は、タスク バー トレイの小さなアイコン上にマウスを置くとポップアップするプロンプト メッセージです。
ここでは、TNotifyIconData の内部ストーリーを紹介するために多くの労力を費やしました。この部分が明確になれば、残りの部分は理解できるでしょう。
三つ。 メイン フォームをダブルクリックして、FormCreate のコード領域に入ります。
TForm1.FormCreate(Sender:TObject);
始める
//NotifyIcon はグローバル変数であり、プログラムの先頭で定義されています
NotifyIcon を使用して行う
始める
cbSize:=SizeOf(TNotifyIconData);
Wnd:=Handle; // 現在のフォーム Form1 を指すハンドル
uID:=1;
uFlags:=NIM_ICON または NIM_MESSAGE または NIM_TIP;
uCallBackMessage:=WM_NID;
hIcon:=アプリケーション.アイコン.ハンドル;
szTip:=”張家の邪悪な若者”;
終わり;。
//設定された変数 NotifyIcon を処理のためにシステムに追加します
Shell_NotifyIcon(NIM_ADD,@NotifyIcon);
終わり;
4.次のステップは、メッセージ処理関数を定義することです。システムがメッセージをフォームに送信すると、メッセージは次の関数によって処理されます。各メッセージ処理関数は、特定の種類のメッセージを処理します。以下の関数本体の定義と一般的な関数定義の違いを詳しく見てください。メッセージ処理関数は最後にメッセージの名前を追加する必要があります。システムが送信するとき WM_NID メッセージが到着すると、WMNID メッセージ処理関数が自動的にトリガーされます。
プロシージャ WMNID(var msg:TMessage);メッセージ WM_NID;
始める
case msg.LParam の
WM_LBUTTONUp; Form1.Visible:=Form1.Visible ではありません;
WM_RBUTTONUP: ShowMessage('右ボタンをクリックしました');
終わり;
終わり;
さて、誰でも好きなアイコンを設定できる最もシンプルなプログラムが誕生しました。
「プロジェクト」->「オプション」から「アプリケーション」ページを選択し、「アイコン」項目にお気に入りのアイコンをロードすると、プログラムの実行中にお気に入りのアイコンがタスクバーに表示されます。アイコンをクリックすると、フォーム Form1 の表示と非表示が切り替わります。つまり、クリックすると表示され、もう一度クリックすると非表示になります。アイコンを右クリックすると、「右のボタンをクリックしました」というメッセージが表示されます。
五。最後に、アプリケーションを閉じるときは、作成したトレイ プログラムを忘れずに解放してください。そうしないと、システム リソースが占有されてしまいます。
TForm1.FormDestroy(Sender:TObject);
始める
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);
終わり;
卒業して半年近くになりますが、学校では理解できないことも多く、社会に出るとたくさんの道教の友人に出会うことができ、とても勉強になりました。何か経験をしたときは、学んだことを必ず言葉に書き留めてまとめたいと思っています。 2つ目は、みんなとコミュニケーションをとりましょう。
E_Mail: [email protected] QQ: 8133413 張家の不良少年