窗口类中定义结构体
在窗体类的OnInitDialog函数中加入
m_stNotifyIcon.cbSize = sizeof(NOTIFYICONDATA);
m_stNotifyIcon.hWnd = this->m_hWnd;//接收托盘消息的窗口句柄 this是当前dialog
//m_stNotifyIcon.uID = 100;//托盘图标的资源ID
m_stNotifyIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
lstrcpyn(m_stNotifyIcon.szTip, L"单击右键显示菜单", sizeof(L"单击右键显示菜单"));//图标上的提示字符串
//m_stNotifyIcon.uCallbackMessage = WM_ONTRAY;//自定义的消息
m_stNotifyIcon.hIcon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));//设置托盘图标
Shell_NotifyIcon(NIM_ADD, &m_stNotifyIcon);// 向任务栏的状态栏发送添加托盘图标的消息
对于IDR_MAINFRAME,在资源视图中可以找到

退出时删除图标
void CTRAYTESTDlg::OnDestroy()
{
// TODO: 在此处添加消息处理程序代码
CDialog::OnDestroy();
Shell_NotifyIcon(NIM_DELETE, &m_stNotifyIcon);// 向任务栏的状态栏发送删除托盘图标的消息
}
可以看到系统产生了托盘图标

如果为托盘图标添加点击事件?使点击 托盘图标能够显示/隐藏窗口?
在头文件中加入自定义消息
定义和实现自定义消息处理函数
LRESULT CTRAYTESTDlg::OnTray(WPARAM wParam, LPARAM lParam) {
UINT uMouseMsg = (UINT)lParam;
switch (uMouseMsg)
{
case WM_LBUTTONDOWN:
if (this->IsWindowVisible())
{
this->ShowWindow(false);
}else{
this->ShowWindow(true);
}
break;
}
return 0;
}
建立消息映射
BEGIN_MESSAGE_MAP(CTRAYTESTDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_ONTRAY, OnTray)//自定义消息映射
//}}AFX_MSG_MAP
ON_WM_CLOSE()
END_MESSAGE_MAP()
设置托盘图标回调消息
效果

如何向托盘添加右键菜单?首先在资源视图中新建菜单资源


定义菜单
在oninitdialog中加载菜单
在托盘点击响应函数中弹出菜单
LRESULT CTRAYTESTDlg::OnTray(WPARAM wParam, LPARAM lParam) {
UINT uMouseMsg = (UINT)lParam;
switch (uMouseMsg)
{
...
case WM_RBUTTONDOWN:
CMenu* pPopup = m_menu.GetSubMenu(0);
CPoint point;
GetCursorPos(&point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL,point.x, point.y, AfxGetApp()->m_pMainWnd, TPM_LEFTALIGN);
break;
}
return 0;
}
为菜单添加点击事件处理程序
void CTRAYTESTDlg::show_about_dlg(){
CAboutDlg about;
about.DoModal();
}
void CTRAYTESTDlg::to_close(){
SendMessage(WM_CLOSE,0,0);
}
建立消息映射
BEGIN_MESSAGE_MAP(CTRAYTESTDlg, CDialog)
...
ON_COMMAND(ID__32771, show_about_dlg)
ON_COMMAND(ID__32772, to_close)
//}}AFX_MSG_MAP
ON_WM_CLOSE()
END_MESSAGE_MAP()
效果
