您的位置:首页 > 其它

MFC 最小化到托盘及右击托盘菜单

2016-01-21 22:30 211 查看
//全局变量
NOTIFYICONDATA nid;//托盘图标全局变量
//在stdafx.h
#define WM_SHOWTASK (WM_USER + 123)
// 关联消息映射函数
// 位于BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
// 当然要声明和定义OnShowTask()
// 在CtestDlg类中声明
LRESULT OnShowTask(WPARAM wParam, LPARAM lParam) ;
void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if (nID == SC_MINIMIZE) // 最小化窗口
{
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd = this->m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK; // 自定义的消息名称
nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
lstrcpy(nid.szTip, _T("Getpost Domain")); // 信息提示条
Shell_NotifyIcon(NIM_ADD, &nid); // 在托盘区添加图标
ShowWindow(SW_HIDE); // 隐藏主窗口
return;
}
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
LRESULT CtestDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
//wParam接收的是图标的ID,lParam接收的是鼠标的动作----最小化到托盘
{
if (wParam != IDR_MAINFRAME)
return 1;
if (WM_LBUTTONDBLCLK == lParam)
{
this->ShowWindow(SW_SHOWNORMAL);
this->SetForegroundWindow();
Shell_NotifyIcon(NIM_DELETE, &nid); // 托盘图标不显示
}
if (lParam == WM_RBUTTONDOWN)
{
//右击弹出托盘菜单
CMenu menu;
menu.LoadMenu(IDR_MENU2);//首先建立菜单项IDR_MENU2
CMenu *pPopUp = menu.GetSubMenu(0);
CPoint pt;
GetCursorPos(&pt);
SetForegroundWindow();
pPopUp->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
PostMessage(WM_NULL, 0, 0);
}
return 0;
}
以上代码在VS2015中测试通过!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: