Shell_NotifyIcon によってシステム トレイにアイコンをインストールすると、このアイコンがダイアログ UI の拡張になります。ユーザーがこのアイコンを操作すると、UI メッセージは OS によって自動的にダイアログにリダイレクトされます。
これらのユーザー メッセージを提供するには、いくつかの手順を実行する必要があります。
(1) (.cpp) ファイル内にメッセージ ハンドラー定義 (ON_MESSAGE(WM_TRAY_NOTIFY, OnTrayNotify)) を追加します。BEGIN_MESSAGE_MAP/END_MESSAGE_MAP ブロック内にある必要があります:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
...
//}}AFX_MSG_MAP
ON_MESSAGE(WM_TRAY_NOTIFY, OnTrayNotify)
END_MESSAGE_MAP()
(2) 実際の作業を実行するために、(.cpp) ファイルにメッセージ ハンドラーの実装を追加します。
void CTestDlg::OnTrayNotify(UINT nID, LPARAM lEvent)
{
if (nID==TRAYICON_ID1)
{
// handle messages here
if (lEvent==WM_LBUTTONDBLCLK)
{ // do left button double click, usually restore application
}
if (lEvent==WM_RBUTTONUP)
{ // do right button up, usually popup a menu at clicked location
}
}
}
(3) このメッセージ ハンドラのプロトタイプ定義 (afx_msg void OnTrayNotify(UINT nID, LPARAM lEvent);) を (.h) ファイル内に追加します。BEGIN_MESSAGE_MAP/END_MESSAGE_MAP ブロック内にある必要があります:
// Generated message map functions
//{{AFX_MSG(CTestDlg)
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
...
//}}AFX_MSG
afx_msg void OnTrayNotify(UINT nID, LPARAM lEvent);
DECLARE_MESSAGE_MAP()
(4) (.h)ファイル内に定義を追加
#define WM_TRAY_NOTIFY WM_USER+567
#define TRAYICON_ID1 0x1234
上記のコードは、次のことを前提としています。
- ダイアログ名は CTestDlg です。ダイアログ名に変更してください
- Shell_NotifyIcon のセットアップに使用されるユーザー コールバック メッセージ識別子 (uCallbackMessage) は、WM_TRAY_NOTIFY です。
- Shell_NotifyIcon をセットアップするために使用されるトレイ アイコン (uID) の識別子は TRAYICON_ID1 です。