1。先定义一个NOTIFYICONDATA类型的变量
typedef struct _NOTIFYICONDATA { DWORD cbSize; //以字节为单位的这个结构的大小 HWND hWnd; //接收托盘图标通知消息的窗口句柄 UINT uID; //应用程序定义的该图标的ID号 UINT uFlags; //设置该图标的属性 UINT uCallbackMessage; //应用程序定义的消息ID号,此消息传递给hWnd HICON hIcon; //图标的句柄 char szTip[64]; //鼠标停留在图标上显示的提示信息 } NOTIFYICONDATA, *PNOTIFYICONDATA; |
该结构中,成员uFlags可以使下列之一或组合:
NIF_ICON 设置成员hIcon有效
NIF_MESSAGE 设置成员uCallbackMessage有效
NIF_TIP 设置成员szTip有效
uCallbackMessage定义了托盘程序发出的事件,(任何操作都会发出这个消息,如右键、左键等),只要响应这个消息即可。也可以重载
WindowProc对消息进行处理。可以自定义一个消息。然后响应这个消息即可。
2。用Shell_NotifyIcon() 添加即可
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid); |
---Pnid是NOTIFYICONDATA结构的指针; dwMessage是被传递的消息,可以是以下消息之一:
NIM_ADD 增加图标
NIM_DELETE 删除图标
NIM_MODIFY 修改图标
///添加托盘图标
void CDlgTest::OnButton7()
{
// TODO: Add your control notification handler code here
m_tnid.cbSize = sizeof(NOTIFYICONDATA);
m_tnid.hWnd = m_hWnd;
m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
m_tnid.uCallbackMessage=MYWM_NOTIFYICON;
CString szToolTip;
szToolTip=_T("托盘图标实例");
_tcscpy(m_tnid.szTip, szToolTip);
m_tnid.uID=IDR_MAINFRAME;
HICON hIcon;
hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_tnid.hIcon = hIcon;
::Shell_NotifyIcon(NIM_ADD, &m_tnid);
if(hIcon) ::DestroyIcon(hIcon);
AfxGetMainWnd()->ShowWindow(SW_HIDE);
}
//删除托盘图标
void CDlgTest::OnButton8()
{
// TODO: Add your control notification handler code here
::Shell_NotifyIcon(NIM_DELETE, &m_tnid);
}
//托盘响应函数
LRESULT CDlgTest::OnMyWm_Notifyicon(WPARAM wParam, LPARAM lParam)
{
if(lParam==WM_LBUTTONDBLCLK)
{
//AfxMessageBox("message send");
//AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
AfxGetMainWnd()->ShowWindow(SW_SHOW);
}
else if(lParam==WM_RBUTTONDOWN)
{
CMenu m;
m.LoadMenu(IDR_MENU1);
CMenu *b = m.GetSubMenu(0);
CPoint cp;
::GetCursorPos(&cp);
b->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, cp.x, cp.y, AfxGetMainWnd());
}
//AfxMessageBox("message send");
return 0;
}
很简单。。。。