まず、需要
紙は、システムトレイにプログラムを実装します。
第二に、インタフェース
主なインタフェースは、最小化、最大化、その他の機能を閉じると、ダイアログです。
第三に、原則
クラスは、トレイマウスイベントを処理し、NOTIFYICONDATAシステムトレイ、カスタム応答メッセージを使用して。
第四に、コーディング
4.1メッセージ定義
WM_USERの定義されたメッセージIDは、便宜上、STDAFX.Hで定義することができ、よりも大きくなければなりません。
#define WM_SHOWTASK (WM_USER+1) // 系统托盘事件
ダイアログヘッダーファイルにメッセージ応答関数を宣言する。
afx_msg LRESULT OnSystemtray(WPARAM wParam, LPARAM lParam);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy();
ダイアログ実装ファイルでは、応答関数に関連したメッセージを追加します。
BEGIN_MESSAGE_MAP(CMyTestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
// ...
ON_MESSAGE(WM_SHOWTASK, OnSystemtray) // 托盘
ON_WM_SIZE()
ON_WM_DESTROY() // 销毁
END_MESSAGE_MAP()
4.2変数宣言
クラスで宣言
private:
NOTIFYICONDATA m_nid;
BOOL m_fMainWinShow; // 托盘 双击左键显示/隐藏窗口
4.3初期化
初期化するためのOnInitDialog関数で:
// 系统托盘
m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
m_nid.hWnd = this->m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
m_nid.uCallbackMessage = WM_SHOWTASK; // 自定义的消息名称
m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy_s(m_nid.szTip, L"主程序"); // 提示程序名称
Shell_NotifyIcon(NIM_ADD, &m_nid); // 在托盘区添加图标
// 如此实现,任务栏没有图标,但窗口没有最小化按钮
#if 0
//ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); // 不在任务栏中显示
// ShowWindow(SW_MINIMIZE);
#endif
//ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); // 不在任务栏中显示
// 可以实现,但界面会闪烁
ShowWindow(SW_MINIMIZE); // 不能使用SW_HIDE
PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0);
m_fMainWinShow = FALSE;
同じ文書は、右マウスの左ボタンを取り扱う含む応答WM_SHOWTASKメッセージを、実装します。
LRESULT CMyTestDlg::OnSystemtray(WPARAM wParam, LPARAM lParam)
{
if (wParam != IDR_MAINFRAME)
return 1;
switch (lParam)
{
case WM_RBUTTONUP: // 右键起来时弹出菜单
{
LPPOINT lpoint = new tagPOINT;
GetCursorPos(lpoint); // 得到鼠标位置
CMenu menu;
menu.CreatePopupMenu(); // 声明一个弹出式菜单
menu.AppendMenu(MF_STRING, WM_DESTROY, L"退出");
SetForegroundWindow();
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y, this);
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK: // 双击左键的处理
{
if (!m_fMainWinShow)
{
ShowWindow(SW_SHOWNORMAL); // 显示主窗口
SetForegroundWindow();
m_fMainWinShow = TRUE;
}
else
{
ShowWindow(SW_HIDE); // 隐藏主窗口
SetForegroundWindow();
m_fMainWinShow = FALSE;
}
}
break;
}
return 0;
}
4.4応答最小化されたウィンドウのイベントを破棄
void CMyTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
if (nType == SIZE_MINIMIZED)
{
ShowWindow(SW_HIDE); // 当最小化时,隐藏主窗口
}
}
void CMyTestDlg::OnDestroy()
{
CDialogEx::OnDestroy();
// 在托盘区删除图标
Shell_NotifyIcon(NIM_DELETE, &m_nid);
}
本稿では、システムトレイ、右のみ「終了」オプションを適宜添加することができる実装しました。
インスタントのために最小化さ点滅ウィンドウを起動するときに、さらに、許容される範囲で、それが解決されていません。