MFC工程实现窗口的最小化,需要实现NOTIFYICONDATA结构体,然后调用Shell_NotifyIcon函数
BOOL Shell_NotifyIcon(
DWORD dwMessage, // 输入消息
PNOTIFYICONDATA lpdata
);
实现托盘的注册过程如下:
#define WM_SHOWTASK WM_USER + 100
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
......
ON_MESSAGE(WM_SHOWTASK, OnShowTask)
END_MESSAGE_MAP()
void CMainFrame::HideDlg()
{
NOTIFYICONDATA nid;
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));
strcpy(nid.szTip, "计算工具\n版本:1.0"); //信息提示条
// wcscpy_s(nid.szTip, _T("计算工具\n版本:1.0")); Unicode下的函数
Shell_NotifyIcon(NIM_ADD, &nid); //在托盘区添加图标
this->ShowWindow(SW_HIDE); //隐藏主窗口
}
在工程最小化到托盘后,还需要根据WM_SHOWTASK自定义消息进行操作,代码如下:
// -----------------------------------------
// 函数名:OnShowTask
// 功 能:将窗口缩小到托盘
// 参 数:
// * wParam--消息附加参数,高16位表示
// 消息通知代码;低16位为控件ID
// * lParam--消息附加参数,指针或句柄
// 返回值:LONG型值
// -----------------------------------------
LRESULT CMainFrame::OnShowTask(WPARAM wParam, LPARAM lParam)
{
if (LOWORD(wParam) != IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONDOWN: // 右键弹起时的操作
{
LPPOINT lpoint = new tagPOINT;
GetCursorPos(lpoint); // 得到鼠标的位置
CMenu menu;
menu.CreatePopupMenu(); // 声明一个弹出式菜单
// 增加菜单项
menu.AppendMenu(MF_STRING, IDC_SHOWMAINFRAME, "显示主窗口");
menu.AppendMenu(MF_STRING, WM_DESTROY, "退出");
// 确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_RIGHTALIGN, lpoint->x, lpoint->y, this);
// 分离菜单句柄与菜单对象
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
}break;
case WM_LBUTTONDBLCLK:
this->ShowWindow(SW_SHOW);
break;
}
}