任务栏托盘
一、隐藏程序的主窗口
并不在任务栏上出现任务按钮,需设置主边框窗口的风格
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style = WS_POPUP;//隐藏主窗口
cs.dwExStyle |= WS_EX_TOOLWINDOW;//隐藏任务按钮
return CFrameWnd::PreCreateWindow(cs);
}
二、托盘程序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
对话框程序
头文件:
NOTIFYICONDATA nd;
LONG OnNotifyIcon(WPARAM wParam, LPARAM lParam);
cpp文件:
#define WM_NOTIFYICON WM_USER+5 //托盘消息
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon) //托盘消息处理
ON_COMMAND(ID_RELOGIN, OnReLogin)//菜单响应函数
ON_COMMAND(ID_CALL, OnCall)
在BOOL CTrayDemoDlg::OnInitDialog()中:
//添加托盘图标
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd = m_hWnd;
nd.uID = IDR_MAINFRAME;
nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nd.uCallbackMessage = WM_NOTIFYICON;
nd.hIcon = m_hIcon;
lstrcpy(nd.szTip, L"托盘项目提示");
Shell_NotifyIcon(NIM_ADD, &nd); //添加托盘图标
//托盘消息:菜单及鼠标动作
LONG CTrayDemoDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
//wParam中是响应消息的图标ID,lParam中则是Windows的消息
switch ( lParam )
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:// 响应在托盘图标上的单击
{
CMenu pMenu;
if (pMenu.LoadMenu(IDR_TRAYMENU)) // 用户在托盘图标上单击鼠标右键,弹出菜单
{
CMenu* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint Point;
if(IsIconic())
{
pPopup->EnableMenuItem(ID_RELOGIN,MF_BYCOMMAND | MF_ENABLED );
pPopup->EnableMenuItem(ID_CALL,MF_BYCOMMAND | MF_ENABLED );
//pPopup->EnableMenuItem(ID_CALL,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
}
// 确定鼠标位置以便在该位置附近显示菜单
GetCursorPos( &Point );
SetForegroundWindow();
pPopup->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
Point.x, Point.y, this);
}
}
break;
case WM_LBUTTONDBLCLK://托盘双击
OnReLogin();
break;
}
return 0;
}
//隐藏对话框并任务栏图标
void CTrayDemoDlg::OnBnClickedQuit()
{
ShowWindow(SW_HIDE);
}
三、托盘数据结构
typedef struct _NOTIFYICONDATA
{
DWORD cbSize; //结构长度,单位:bit,一般用(DWORD)sizeof(NOTIFYICONDATA)
HWND hWnd; //窗口句柄,对托盘图标操作消息所传递的窗口,一般是this->m_hWnd
UINT uID; //图标ID
UINT uFlags; //有效标志,NIF_ICON标识hIcon有效,NIF_MESSAGE标识uCallbackMessage,NIF_TIP标识szTip
UINT uCallbackMessage; //自定义消息,处理托盘操作
HICON hIcon; //图标,一般是m_hIcon; 如果只知道uID,一般会用LoadIcon(AfxGetInstanceHandle(),MAKEINTERSOURCE(IDR_MAINFRAME))
char szTip[64]; //托盘提示文字
}NOTIFYICONDATA, *PNOTIFYICONDATA;
四、托盘消息
绘制图标及其他操作传递消息的系统函数:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA pnid);
pnid是NOTIFYICONDATA结构指针,dwMessage是被传递的消息
消息有:
NIM_ADD |
修改图标 |
NIM_DELETE |
删除图标 |
NIM_MODIFY |
修改图标 |
程序退出时删除图标:
::Shell_NotifyIcon(NIM_DELETE, &m_tnid);