エンタープライズ:特集 | 2003/07/18 11:58:00 更新 |
[C Magazine連載]プログラムのレシピ(第1回)
デスクトップメモを作る (4/9)
C MAGAZINE 2002年9月号より転載
タスクトレイの操作 |
今回のデスクトップメモでまずポイントになるのは、タスクトレイの操作です。今回のアプリケーションでは、タスクトレイにFig.2のようなアイコンを配置します。そしてユーザがアイコンをクリックしたら、Fig.3のようなポップアップメニューを表示します。ポップアップメニューからは、新しいメモを作成したり、設定ウィンドウを表示したりすることができます。
Fig.2 タスクトレイ上のアプリケーションアイコン
Fig.3 アイコンをクリックしたときに表示されるポップアップメニュー
タスクトレイを使うには、次のようにプログラムを作ります。
(1)設定ウィンドウなどをメインウィンドウにしておく。また、ポップアップメニューも用意する
(2)起動時に、タスクトレイにアイコンを登録する。またこの際、メインウィンドウは表示しない
(3)タスクトレイをクリックしたときにポップアップメニューを表示するよう、イベント処理を定義する
(4)終了時に、タスクトレイからアイコンを除去する
この手順は、Win32 APIでもC++Builderでも同じです。C++Builderの場合も、基本的にはWin32 APIを使って実装します。
●プログラム例
C++Builderの場合には、まず、普通にプロジェクト(VCLアプリケーション)を作成します。そして、Fig.4のようなメインフォーム(メインウィンドウ)を作ります。 Fig.4はデスクトップメモの設定を行うためのフォームです。もちろん、最初からこんなにたくさんの設定項目を作る必要はありません。プログラムの開発を進めながら、必要に応じて設定項目を増やしていけばいいのです。たとえば、最初は閉じるボタンだけでもかまいません。
Fig.4 デスクトップメモのメインウィンドウ(メインフォーム)
次に、Fig.3のようなポップアップメニューを作ります。C++Builderの場合、ポップアップメニューはメインフォームに配置します。ここまでで前述の手順の(1)は完了ですね。
続いて、タスクトレイにアイコンを登録する(2)の処理を書きます。プログラムはList 1で、処理の内容はWin32 APIとC++Builderに共通です。C++Builderの場合、メインフォームのコンストラクタにこの処理を追加します。
List 1 タスクトレイにアイコンを登録する(UConsoleForm.cpp) |
// コンストラクタ __fastcall TConsoleForm::TConsoleForm(TComponent* Owner) : TForm(Owner) { // タスクトレイにアイコンを登録する NOTIFYICONDATA icn; icn.cbSize = sizeof(NOTIFYICONDATA); icn.hWnd = Handle; icn.uID = 100; icn.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; icn.uCallbackMessage = WM_USER + 1; icn.hIcon=Icon->Handle; lstrcpy(icn.szTip,"デスクトップメモ"); Shell_NotifyIcon( NIM_ADD, &icn ); } |
手順(2)では、起動時にメインフォームを表示しないようにしなければなりません。そのためには、アプリケーションのメインルーチンをList 2のように書き換えます。List 2-(1)がメインフォームを非表示にするための処理です。
List 2 メインウィンドウ(メインフォーム)を表示しないための処理(DesktopMemo.cpp) |
// アプリケーションのメインルーチン WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->Title = "デスクトップメモ"; Application->CreateForm(__classid(TConsoleForm), &ConsoleForm); //====================================================== (1) // メインフォーム(ConsoleForm)を最初に表示しない ShowWindow(Application->Handle, SW_HIDE); Application->ShowMainForm=false; Application->Run(); } // ... 中略 ... } |
手順(3)は、ポップアップメニューを表示するイベント処理です。ここでは、ヘッダファイルにList 3-(1)のような記述を追加して、C++ソースファイルにはList 4のような処理を書く必要があります。List 4では、マウスが右クリックされたかどうかを調べ、マウスカーソルの位置にポップアップメニューを表示します。
List 3 アイコンのクリック時にポップアップメニューを表示する(UConsoleForm.h) |
// メインフォーム(設定用ダイアログ)のクラス class TConsoleForm : public TForm { __published: // IDE 管理のコンポーネント // ... 中略 ... private: // ユーザー宣言 //========================================================== (1) // タスクトレイのイベント処理 void __fastcall TrayEvent(TMessage& Msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_USER+1, TMessage, TrayEvent) END_MESSAGE_MAP(TForm) // ... 中略 ... public: // ユーザー宣言 // ... 中略 ... }; |
List 4 アイコンのクリック時にポップアップメニューを表示する(UConsoleForm.cpp) |
// タスクトレイ上のアイコンがクリックされたときの処理 void __fastcall TConsoleForm::TrayEvent(TMessage& Msg) { // 右クリックの場合、ポップアップメニューを表示する if (Msg.LParam==WM_RBUTTONDOWN ) { POINT P; GetCursorPos(&P); SetForegroundWindow(Handle); TrayPopupMenu->Popup(P.x,P.y); } } |
最後の手順(4)は、プログラムの終了時にタスクトレイからアイコンを消す処理です。これはメインフォームのデストラクタに、List 5のような処理を書けば実現できます。List 1とList 5はよく似た処理ですね。
List 5 タスクトレイからアイコンを除去する(UConsoleForm.cpp) |
// デストラクタ __fastcall TConsoleForm::~TConsoleForm() { // タスクトレイからアイコンを除去する NOTIFYICONDATA icn; icn.cbSize = sizeof(NOTIFYICONDATA); icn.hWnd = Handle; icn.uID = 100; icn.uFlags = 0; Shell_NotifyIcon( NIM_DELETE, &icn ); } |
ちょっとめんどうでしたが、これでタスクトレイ周りの処理は完成です。大部分はWin32 APIなので、C++Builder以外の開発環境でも基本的には同じプログラムです。
[C Magazine連載]プログラムのレシピ(第1回) | |
(1)連載のはじめに | |
(2)どんな機能を作るか | |
(3)作成のポイント | |
(4)タスクトレイの操作 | |
(5)メモの作成と表示 | |
(6)メモデータの保存と読み込み | |
(7)タブ画像の選択 | |
(8)日程管理機能 | |
(9)まとめ | |
・実行ファイル/リソース一式(.lzh形式/1.32MB) | |
・リスト(.lzh形式/5.45KB) |
関連リンク
C MAGAZINE
定期購読のご案内
バックナンバー一覧
バックナンバー販売協力店
ひぐぺん工房
「デスクトップマスコットを作ろう」紹介ページ
「デスクトップマスコットを作ろう」著者ページ
前のページ | 1 2 3 4 5 6 7 8 9 | 次のページ
[松浦健一郎(ひぐぺん工房),C MAGAZINE]