最小化后右下角(托盘)小图标的实现
2015-10-18 16:34
399 查看
1.想要实现这样的效果
2.我参考了“如何实现最小化后出现右下角图标”/article/6659520.html
"让一个程序托盘显示,并且右键托盘图标可以弹出菜单"/article/5776388.html
3.这个效果实现的主要核心是 NOTIFYICONDATA 结构
,然后通过Shell_NotifyIcon( NIM_ADD, &m_tnd );
和 Shell_NotifyIcon( NIM_DELETE, &m_tnd );这两个函数来实现对右下角图标的显示和消除。
4.NOTIFYICONDATA这个结构中的各个值定义了我们这个右下角小图标的种种属性。
详细介绍的MSDN链接https://msdn.microsoft.com/zh-cn/vstudio/bb773352
5. 先讲下个人理解的思路,顺便梳理下NOTIFYICONDATA中的种种关系,代码是次要的。
我是在MFC下做的,将这个NOTIFYCONDATA结构变量我是定义在CFrame类中的,NOTIFYICONDATA m_tnd。
在Frame初始化的时候,在OnCreate中完成NOTIFYCONDATA结构的初始化以及图标的显示。
通过调用Shell_NotifyIcon( NIM_ADD, &m_tnd );
我们在小图标上的右键啊,双击之类的动作,将通过uCallbackMessage中定义的消息发送给hWnd。由于是CFrame调用的,我们将在CFrame中添加关于我们所自定义的uCallbackMessage这个消息的响应函数,这个Message和我们平时的WM_SYSCOMMAND一样,有wParam和lParam。
它的wParam就是我们在NOTIFYICONDATA结构中设置的uID,lParam则是在图标上做的操作,以消息的形式给出,如WM_RBUTTONDOWN。
6.具体实现:
在资源文件中#define WM_TRAYICON (WM_USER+1),WM_TRAYICON就是我们在结构中自定义的消息。
在CFrame类中添加一个NOTIFYICONDATA成员。
在CFrame类的OnCreate和OnDestroy函数中分别完成NOTIFYICONDATA结构填写、图标显示和图标删除。显示和删除使用Shell_NotifyIcon函数。
在CFrame类的class
wizard-》消息有个添加自定义消息,添加我们定义的那个uCallbackMessage,并在其中填写lParam中或是左键双击或是右键的消息的处理
添加WM_SYSCOMMAND的处理消息,点击最小化的时候,是的窗口hide。
7.为了简洁我只复制了新增代码,代码给出的顺序与第6点钟给出的顺序一致
8.效果
2.我参考了“如何实现最小化后出现右下角图标”/article/6659520.html
"让一个程序托盘显示,并且右键托盘图标可以弹出菜单"/article/5776388.html
3.这个效果实现的主要核心是 NOTIFYICONDATA 结构
,然后通过Shell_NotifyIcon( NIM_ADD, &m_tnd );
和 Shell_NotifyIcon( NIM_DELETE, &m_tnd );这两个函数来实现对右下角图标的显示和消除。
4.NOTIFYICONDATA这个结构中的各个值定义了我们这个右下角小图标的种种属性。
详细介绍的MSDN链接https://msdn.microsoft.com/zh-cn/vstudio/bb773352
typedef struct _NOTIFYICONDATA { DWORD cbSize; //结构长度 sizeof( NOTIFYICONDATA ) HWND hWnd; //调用该结构的句柄 UINT uID; // 一个唯一标识的ID,用来标识操作哪一个图标 UINT uFlags; //比如NIF_MESSAGE | NIF_ICON | NIF_TIP,用来标识该结构中hIcon,uCallbackMessage,szTip中的值为有效值,其他以此类推 UINT uCallbackMessage; // 自定义一个消息,WM_XXXXXX,我们点击小图标的时候,种种操作将以这个消息的形式发送 HICON hIcon; // 很明显,这是小图标句柄 TCHAR szTip[64]; //放入一个字符串,鼠标放在图标上的时候会出现一个小气泡显示这数组内的字符串,支持转义字符 DWORD dwState; DWORD dwStateMask; TCHAR szInfo[256]; union { UINT uTimeout; UINT uVersion; }; TCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; HICON hBalloonIcon; } NOTIFYICONDATA, *PNOTIFYICONDATA;
5. 先讲下个人理解的思路,顺便梳理下NOTIFYICONDATA中的种种关系,代码是次要的。
我是在MFC下做的,将这个NOTIFYCONDATA结构变量我是定义在CFrame类中的,NOTIFYICONDATA m_tnd。
在Frame初始化的时候,在OnCreate中完成NOTIFYCONDATA结构的初始化以及图标的显示。
通过调用Shell_NotifyIcon( NIM_ADD, &m_tnd );
我们在小图标上的右键啊,双击之类的动作,将通过uCallbackMessage中定义的消息发送给hWnd。由于是CFrame调用的,我们将在CFrame中添加关于我们所自定义的uCallbackMessage这个消息的响应函数,这个Message和我们平时的WM_SYSCOMMAND一样,有wParam和lParam。
它的wParam就是我们在NOTIFYICONDATA结构中设置的uID,lParam则是在图标上做的操作,以消息的形式给出,如WM_RBUTTONDOWN。
6.具体实现:
在资源文件中#define WM_TRAYICON (WM_USER+1),WM_TRAYICON就是我们在结构中自定义的消息。
在CFrame类中添加一个NOTIFYICONDATA成员。
在CFrame类的OnCreate和OnDestroy函数中分别完成NOTIFYICONDATA结构填写、图标显示和图标删除。显示和删除使用Shell_NotifyIcon函数。
在CFrame类的class
wizard-》消息有个添加自定义消息,添加我们定义的那个uCallbackMessage,并在其中填写lParam中或是左键双击或是右键的消息的处理
添加WM_SYSCOMMAND的处理消息,点击最小化的时候,是的窗口hide。
7.为了简洁我只复制了新增代码,代码给出的顺序与第6点钟给出的顺序一致
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ SetupTrayIcon(m_hWnd); } BOOL CMainFrame::SetupTrayIcon(HWND hwnd) { m_tnd.cbSize = sizeof( NOTIFYICONDATA ); m_tnd.hWnd = hwnd;// m_tnd.uID = 1123583721; //只是为了说明UID是个数字ID,随意不重复即可,第2节中两篇文章用的”IDR_MAINFRAME“图个方便 m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; m_tnd.uCallbackMessage = WM_TRAYICON; m_tnd.hIcon = AfxGetApp()->LoadIconA(IDR_MAINFRAME) strcpy_s(m_tnd.szTip,_T("MFC\nhello\n 88")); //这里是为了验证转义字符是否有效,显示多行,像qq一样 return Shell_NotifyIcon( NIM_ADD, &m_tnd ); } void CMainFrame::OnDestroy() { CFrameWnd::OnDestroy(); RemoveTrayIcon(); } BOOL CMainFrame::RemoveTrayIcon() { return Shell_NotifyIcon( NIM_DELETE, &m_tnd ); } afx_msg LRESULT CMainFrame::OnTrayicon(WPARAM wParam, LPARAM lParam) { if (wParam==1123583721) { switch (lParam) { case WM_RBUTTONDOWN: { 添加右键菜单
} break; case WM_LBUTTONDBLCLK: 双击显示程序窗口 break; } } return 0; } void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam) { if( nID == SC_MINIMIZE) ShowWindow(SW_HIDE); else CFrameWnd::OnSysCommand(nID, lParam); }
8.效果
9.小问题:
在实现右键菜单的时候,两篇文章代码中都有这么一句话
SetForegroundWindow();//这一行代码很重要,否则右键菜单工作//不正常。
我认为这是个把窗口放到最前端的函数,而右键的时候一般窗口还在隐藏阶段,我就把这行代码删除了。运行结果看起来也并没有什么大碍。
几次测试后,发现右键菜单弹出后点击屏幕别的地方菜单不能够自动消失。除非我们在窗口未被最小化的时候,右键小图标显示菜单,然后在客户区内点击,菜单才会自动消失。恍然大悟,把这行又加了回去。
10.遗留:
可以尝试这去像qq一样,右键菜单然后改变这个右下角图标。
相关文章推荐
- Ajax大文件切割传输
- java值传递还是应用传递
- 多元统计分析上机题之R语言实现(多元正态分布)
- ubuntu下Pycharm安装及配置
- Android开发学习日记
- 数据接口的同步方法
- 转: Photoshop cs6 快捷键命令大全
- 关于单CPU,多CPU上的原子操作
- BLOG搬家
- servlet处理html表单文件上传
- tableView头部放scrollView滚动视图
- BLOG搬家
- 拥抱 HTML5:storage 简介以及使用方法
- 从表中随机返回n条记录
- php项目琐碎总结
- Node 笔记
- Windows下Mysql5.6启动日志
- android 布局如何支持多种不同屏幕尺寸
- python IDLE入门
- Struts-文件上传