两种方法实现托盘功能
来源:互联网 发布:棋牌类算法 编辑:程序博客网 时间:2024/06/01 07:22
1为了实现托盘功能,我们可以使用消息机制来进行实现
我们需要使用到windows的一个API函数:BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA lpdata);其中dwMessage可以取以下值:
NIM_ADD 向托盘中加入一个图标
NIM_MODIFY 修改托盘中的图标
NIM_DELETE 从托盘中删除一个图标
参数pnid是NOTIFYICONDATA结构的一个引用。该结构的原型如下:
typedef struct _NOTIFYICONDATA { DWORD cbSize; // 结构的大小,必须在程序中给出 HWND hWnd; // 程序中将要接收托盘消息的窗口句柄 UINT uID; // 应用程序中定义的托盘图标ID,此参数用作标识 UINT uFlags; //设置属性 标记下边3个参数是否有效 UINT uCallbackMessage;// 自定义的消息ID值 HICON hIcon;//显示在系统托盘上的Icon的句柄 #if (_WIN32_IE < 0x0500) TCHAR szTip[64;// 用于图标显示的提示字符串 #else TCHAR szTip[128]; #endif #if (_WIN32_IE >= 0x0500) DWORD dwState; DWORD dwStateMask; TCHAR szInfo[256]; union { UINT uTimeout; UINT uVersion; } DUMMYUNIONNAME; TCHAR szInfoTitle[64]; DWORD dwInfoFlags; #endif #if (_WIN32_IE >= 0x600) GUID guidItem; #endif} NOTIFYICONDATA, *PNOTIFYICONDATA;
(1)我们可以自定义一个托盘消息WM_TRAY和NOTIFYICONDATA 变量,在XXDlg.h中添加
define WM_TRAY WM_USER+1
NOTIFYICONDATA nid;
(2)在XXDlg.h中添加消息的处理函数
afx_msg LRESULT OnTrayNotify(WPARAM wParam,LPARAM lParam);
(3)在XXDlg.cpp中添加消息映射
ON_MESSAGE(WM_TRAY,OnTrayNotify)
(4)编写NOTIFYICONDATA nid初始化函数
void CTrayDlg::InitTray(){ nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; nid.uCallbackMessage=WM_TRAY;//自定义的消息名称 nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip,_T("程序名称")); //信息提示条 Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标 }
(5)在OnInitDialog()函数中调用InitTray()函数
(6)编写 LRESULT OnTrayNotify(WPARAM wParam,LPARAM lParam)函数实现代码
//wParam处理图标信息,lParam处理鼠标信息LRESULT CTrayDlg::OnTrayNotify(WPARAM wParam, LPARAM 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,"关闭"); //确定弹出式菜单的位置 SetForegroundWindow(); // 防止未选菜单不消失 menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //资源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); delete lpoint; } break; case WM_LBUTTONDBLCLK://双击左键的处理 { //窗口前端显示 SetForegroundWindow(); ShowWindow(SW_SHOWNORMAL); } break; default: break; } return 0; }
(7)添加WM_SIZE消息处理函数
void CTrayDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (nType==SIZE_MINIMIZED) { ShowWindow(SW_HIDE); }}
(8)添加WM_CLOSE消息处理函数
void CTrayDlg::OnClose() { // TODO: Add your message handler code here and/or call default Shell_NotifyIcon(NIM_DELETE,&nid); //删除图标 CDialog::OnClose();}
2 直接对WindowProc函数进行重载,它是一个虚函数
LRESULT CTrayDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch(message) //判断消息类型 { case WM_TRAY: //如果是用户定义的消息 if(lParam==WM_LBUTTONDBLCLK) { //鼠标双击时主窗口出现 if(AfxGetApp()->m_pMainWnd->IsWindowVisible()) //判断窗口当前状态 { AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); //隐藏窗口 } else { AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW); //显示窗口 } } else if(lParam==WM_RBUTTONDOWN) { //鼠标右键单击弹出选单 LPPOINT lpoint=new tagPOINT; GetCursorPos(lpoint);//得到鼠标位置 CMenu menu; menu.CreatePopupMenu();//声明一个弹出式菜单 //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏),将程序结束。 menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭"); //确定弹出式菜单的位置 SetForegroundWindow(); // 防止未选菜单不消失 menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //资源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); delete lpoint; } break; case WM_SYSCOMMAND: //如果是系统消息 if(wParam==SC_MINIMIZE) { //接收到最小化消息时主窗口隐藏 AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE); return 0; } if(wParam==SC_CLOSE) { Shell_NotifyIcon(NIM_DELETE,&nid); //关闭时删除系统托盘图标 } break; } return CDialog::WindowProc(message, wParam, lParam);}
1 0
- 两种方法实现托盘功能
- 托盘功能的实现
- 菜单功能的两种实现方法
- 重写构造方法实现两种功能
- android 实现分享功能两种方法
- 快速实现托盘功能--VC
- WinForm 托盘功能的实现
- iOS应用实现评论功能的两种方法
- iOS应用实现评论功能的两种方法
- iOS应用实现评论功能的两种方法
- 两种方法实现点击图片调用上传功能
- 最小化托盘的实现方法
- 托盘功能的实现(MFC)
- Python:程序最小化到托盘功能实现
- 控制DIV显隐 实现选项卡功能的两种方法
- 控制DIV显隐 实现选项卡功能的两种方法
- 使用服务端和客户端两种方法 模拟网易邮箱实现全选,全不选的功能
- 两种方式实现checkBox readonly功能
- Win7 VNC远程连接Centos桌面
- unix网络编程几种模型比较
- HTML网页设计——01
- 回到梦想开始的地方——致我的ACM
- 算法竞赛入门经典:第七章 暴力求解法 7.10 二进制法
- 两种方法实现托盘功能
- iconv
- Hibernate基础
- 浅析Java内存模型
- 鼠标控制旋转
- mysql主从复制
- POJ 1195 Mobile phones
- android下使用aapt命令测试启动时间
- 算法竞赛入门经典:第七章 暴力求解法 7.11回溯法