参考文章:http://www.cnblogs.com/zhangpengshou/archive/2009/07/11/1520819.html
基本上是按照这篇文章所写的方法来做的,只有稍许改动。
在VC6.0下实现的步骤如下:
一、创建基于对话框的MFC程式
二、导入一图标ICON,ID设为IDI_TRAY
三、为新建的对话框类添加成员变量 NOTIFYICONDATA m_nid;
四、自定义消息,后面会用到。#define WM_SHOWTASK WM_USER+100
五、在OnInitDialog()对话框初始化函数中添加如下代码
// TODO: Add extra initialization here m_nid.cbSize = sizeof(m_nid); m_nid.hWnd = this->GetSafeHwnd(); //自定义消息发送的窗口 m_nid.hIcon = AfxGetApp()->LoadIcon(IDI_TRAY); //导入的ICON,在托盘中显示 m_nid.uCallbackMessage = WM_SHOWTASK; //自定义的消息 m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; m_nid.uID = 100; /*WM_SHOWTASK*/ //ID,好像随便定个值就OK了 _tcscpy(m_nid.szTip, TEXT("TrayDlg")); //信息提示条 Shell_NotifyIcon(NIM_ADD, &m_nid); //在托盘区添加图标六、在新建的对话框类中添加消息响应函数
virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam); //}}AFX_MSG DECLARE_MESSAGE_MAP()
七、在源文件中进行消息映射
BEGIN_MESSAGE_MAP(CTrayDlgDlg, CDialog) //{{AFX_MSG_MAP(CTrayDlgDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_MESSAGE(WM_SHOWTASK, OnShowTask) //}}AFX_MSG_MAP END_MESSAGE_MAP()八、实现消息响应函数
LRESULT CTrayDlgDlg::OnShowTask(WPARAM wParam, LPARAM lParam) { switch(lParam) { case WM_RBUTTONUP: //右键弹时弹出菜单 { CPoint pnt; ::GetCursorPos(&pnt); //得到鼠标位置 CMenu menu; menu.CreatePopupMenu(); //声明一个弹出式菜单 menu.AppendMenu(MF_STRING, WM_DESTROY, "关闭"); menu.TrackPopupMenu(TPM_LEFTALIGN, pnt.x, pnt.y, this); HMENU hmenu = menu.Detach(); menu.DestroyMenu(); } break; case WM_LBUTTONDBLCLK: //双击左键的处理 { this->ShowWindow(SW_SHOWNORMAL); //显示主窗口 //this->ShowWindow(SW_SHOW); //注意SW_SHOW与SW_SHOWNORMAL的区别 } break; } return 0; }九、 添加关闭窗口时的消息响应函数,将托盘中的应用程序图标删除
BOOL CTrayDlgDlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class Shell_NotifyIcon(NIM_DELETE, &m_nid); // 在托盘区删除图标 return CDialog::DestroyWindow(); }