对话框最小化到托盘,并鼠标右键添加菜单以及对应菜单功能
集成环境为VS2013
一、将对话框最小化到托盘
1.首先对话框属性保证可最小化,对话框”Minimize Box”为TRUE。
2.添加WM_SIZE消息,并添加条件语句:
void CIndustrialDisplayDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if (nType == SIZE_MINIMIZED)
{
ShowWindow(SW_HIDE);//窗口隐藏
}
}
3.在托盘区添加图标
//最下化到托盘
void CIndustrialDisplayDlg::toTray()//最小化到托盘
{
NOTIFYICONDATA nid;
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1; //自绘的图标
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK;//自定义的消息名称
nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
strcpy(nid.szTip, "显示屏显示");//信息提示条为“OA”
Shell_NotifyIcon(NIM_ADD, &nid);//在托盘区添加图标
}
4.在托盘区删除图标
//摧毁托盘
void CIndustrialDisplayDlg::DeleteTray()//销毁托盘图标
{
NOTIFYICONDATA nid;
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK;
nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
strcpy(nid.szTip, "显示屏显示");
Shell_NotifyIcon(NIM_DELETE, &nid);
}
5.在需要的位置写入调用:
PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0); // 自动托盘
toTray();
ShowWindow(SW_HIDE);
二、鼠标右键添加菜单以及对应菜单功能
1.添加菜单 IDR_MENU_TRAY
2.添加消息
a) 在头文件中添加:
#define WM_SHOWTASK WM_USER + 100 //定义消息的值
b) 在源文件中xxxDlg.cpp添加消息
ON_MESSAGE(WM_SHOWTASK, OnShowTask)
3.添加函数:
a) 在头文件xxxDlg.h中添加声明
afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
b) 在源文件中xxxDlg.cpp添加函数
LRESULT CIndustrialDisplayDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{
if (wParam != IDI_ICON1)
return 1;
switch (lParam)
{
case WM_RBUTTONUP: // 右键起来时弹出菜单
{
CPoint point;
::GetCursorPos(&point);
CMenu menu;
menu.LoadMenu(IDR_MENU_TRAY);
CMenu* pSubMenu = menu.GetSubMenu(0);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
}
break;
case WM_LBUTTONDBLCLK: // 双击左键的处理
{
this->ShowWindow(SW_SHOWNORMAL); // 显示主窗口
}
break;
}
return 0;
}
4.还原对话框
this->ShowWindow(SW_SHOWNORMAL);