MFC添加最小化托盘(右下角小图标)
方法网上很多,我也是按照如上实现
vs2010写的
Dlg的.h文件添加
NOTIFYICONDATA nid; //托盘图标
Dlg的.cpp文件,OnInitDialog添加:
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));
_tcscpy_s(nid.szTip,sizeof(nid.szTip), _T("计划任务提醒 "));//信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
这样托盘图标就一直显示了。
单击托盘,显示隐藏窗口,需要创建:
Dlg的cpp文件BEGIN_MESSAGE_MAP添加:ON_MESSAGE(WM_SHOWTASK,OnShowTask)
Dlg的.h文件添加宏#define WM_SHOWTASK (WM_USER+100) 和 LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
Dlg的cpp文件文件添加事件具体处理函数【右键出现删除,左键单击一次隐藏一次显示,ifMainWinShow自己的全局变量在.h定义即可】
LRESULT CcaptureDlg::OnShowTask(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"关闭");
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDOWN: // 双击左键的处理
{
if (!ifMainWinShow)
{
this->ShowWindow(SW_SHOWNORMAL); // 显示主窗口
ifMainWinShow = true;
}
else
{
this->ShowWindow(SW_HIDE); // 隐藏主窗口
ifMainWinShow = false;
}
}
break;
}
return 0;
}
如上是网上查到的常规最小化托盘,但是有个问题程序启动会出现窗口,我希望启动就隐藏。
尝试经过很多尝试:
在OnInitDialog添加
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//从任务栏中去掉.
ShowWindow(SW_MINIMIZE);//注意此处是最小化,不是SW_HIDE
此时程序的一直不会出现在任务栏(即使窗口显示的时候),恰好符合我的要求。