エンタープライズ:特集 2003/07/18 11:58:00 更新
C Magazine

[C Magazine連載]プログラムのレシピ(第1回)
デスクトップメモを作る (4/9)

C MAGAZINE 2002年9月号より転載

タスクトレイの操作
 だいたいプログラムのイメージができたので、制作にとりかかりましょう。本連載では「建て増し式プログラミング」を推奨します。これは、自分が作りたいところ、あるいは技術的に難しそうなところから、いい意味で建て増し式に作っていく方法です。

 今回のデスクトップメモでまずポイントになるのは、タスクトレイの操作です。今回のアプリケーションでは、タスクトレイにFig.2のようなアイコンを配置します。そしてユーザがアイコンをクリックしたら、Fig.3のようなポップアップメニューを表示します。ポップアップメニューからは、新しいメモを作成したり、設定ウィンドウを表示したりすることができます。

Fig.2
Fig.2 タスクトレイ上のアプリケーションアイコン

Fig.3
Fig.3 アイコンをクリックしたときに表示されるポップアップメニュー

 タスクトレイを使うには、次のようにプログラムを作ります。

(1)設定ウィンドウなどをメインウィンドウにしておく。また、ポップアップメニューも用意する

(2)起動時に、タスクトレイにアイコンを登録する。またこの際、メインウィンドウは表示しない

(3)タスクトレイをクリックしたときにポップアップメニューを表示するよう、イベント処理を定義する

(4)終了時に、タスクトレイからアイコンを除去する

 この手順は、Win32 APIでもC++Builderでも同じです。C++Builderの場合も、基本的にはWin32 APIを使って実装します。

●プログラム例

 C++Builderの場合には、まず、普通にプロジェクト(VCLアプリケーション)を作成します。そして、Fig.4のようなメインフォーム(メインウィンドウ)を作ります。  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]