VC下添加和删除自己系统托盘图标,及托盘事件的响应
添加和删除系统托盘图标:
//需要添加一个成员变量
NOTIFYICONDATA m_nd; //NOTIFYICONDATA结构
/***************************************
* 将图标加入系统托盘
* 参数:
* hWnd - 窗体句柄
* hIcon - 所要加入的图标句柄
* title - 悬停于系统托盘之上时所要显示的消息
* uCallbackMessage - 消息标识(需用户自己定义消息)
***************************************/
void CMyDlg::AddIcon(HWND hWnd, HICON hIcon, UINT uCallbackMessage, char *title)
{
m_nd.cbSize = sizeof(NOTIFYICONDATA);
m_nd.hWnd = hWnd;
m_nd.uID = IDR_MAINFRAME;
m_nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_nd.uCallbackMessage = uCallbackMessage;
m_nd.hIcon = hIcon;
strcpy(m_nd.szTip, title);
Shell_NotifyIcon(NIM_ADD, &m_nd); //加入图标
}
//删除系统托盘图标
void CMyDlg::RemoveIcon()
{
Shell_NotifyIcon(NIM_DELETE, &m_nd);
}
下面就是为图标添加自己的响应消息:
//用户定义的消息(在相应头文件中加入)
#define MYWM_NOTIFYICON WM_USER+1
//添加WinProc消息函数
LRESULT CMyCatchScreenDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
case MYWM_NOTIFYICON:
//如果是用户定义的消息
if(lParam==WM_LBUTTONDOWN)
{
//添加自己的函数
//鼠标单击图标时主窗口出现
//ShowMyWindow();
}
else if(lParam==WM_RBUTTONDOWN)
{
//添加自己的函数
//鼠标右键单击弹出选单
/*
CMenu menu;
menu.LoadMenu(IDR_MY_MENU); //载入事先定义的选单
CMenu*pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
*/
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
调用演示:
void CMyDlg::ShowMyWindow()
{
RemoveIcon(); //删除系统图标
ShowWindow(SW_SHOW); //显示窗口
}
void CMyDlg::HideMyWindow()
{
ShowWindow(SW_HIDE); //隐藏窗口
AddIcon(m_hWnd,m_hIcon,MYWM_NOTIFYICON,"MyDlg"); //添加系统图标
}
Trackback from your site.