本文主要是介绍MFC托盘图标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1,首先我们用AppWizard创建一个基于对话框的应用程序CUserDlg。m_nid为类成员变量NOTIFYICONDATA m_nid;
2,实现CUserDlg的成员函数:
void ToTray(){m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);m_nid.hWnd = this->m_hWnd;m_nid.uID = IDR_MAINFRAME;m_nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP ;m_nid.uCallbackMessage = WM_SHOWTASK; //托盘回调消息id//自定义的消息名称 WM_SHOWTASK 头函数中定义为WM_USER+1m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//托盘图标strcpy(m_nid.szTip,"托盘图标");//当鼠标放在上面时,所显示的内容Shell_NotifyIcon(NIM_ADD,&m_nid);//在托盘区添加图标
}
3,#define WM_SHOWTASK WM_USER+1
4,添加消息WM_SHOWTASK的响应函数afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);
在BEGIN_MESSAGE_MAP(CUserDlg,CDialog)和END_MESSAGE_MAP()之间加代码:
ON_MESSAGE(WM_SHOWTASK,onShowTask)
(3、4步可以通过向导来自动生成)
5,编写响应函数onShowTask:
LRESULT CUserDlg::onShowTask(WPARAM wParam,LPARAM lParam) //wParam接收的是图标的ID,lParam接收的是鼠标的行为
{if(wParam!=IDR_MAINFRAME)return 1;switch(lParam){case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”{ LPPOINT lpoint=new tagPOINT;::GetCursorPos(lpoint);//得到鼠标位置CMenu menu;menu.CreatePopupMenu();//声明一个弹出式菜单//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已//隐藏),将程序结束。menu.AppendMenu(MF_STRING,WM_DESTROY,"退出");//确定弹出式菜单的位置menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);//资源回收HMENU hmenu=menu.Detach();menu.DestroyMenu();delete lpoint;}break;case WM_LBUTTONDBLCLK://双击左键的处理{ this->ShowWindow(SW_SHOWNORMAL);//简单的显示主窗口}break;}return 0;
}
6,然后在OnInitDialog函数中调用ToTray();
7,为使应用程序退出时图标消失,映射WM_DESTROY消息,在OnDestroy()函数中加入:
::Shell_NotifyIcon(NIM_DELETE,&m_nid);
以上代码还存在一个问题,右键单击托盘图标,跳出菜单后无法消失。需要在menu.TrackPopupMenu前面加这么一句SetForegroundWindow();
这篇关于MFC托盘图标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!