其实最小化托盘的原理不难理解,当用户选择最小化托盘时,程序并没有到托盘里,只是使用 ShowWindow函数隐藏了程序,同时在托盘上显示了一个图标,还有一种情况,当程序打开后,托盘上就显示了一个图标,当选择最小化托盘时,只需要使用ShowWindow函数隐藏程序就行了
在写代码前先看一下程序最小化托盘使用的一个非常重要的函数ShowWindow和托盘结构
ShowWindow函数用于设置窗口的显示方式
BOOL WINAPI ShowWindow(
_In_ HWND hWnd,
_In_ int nCmdShow
);
ShowWindow有两个参数一个是窗口的句柄,一个是窗口的显示方式
而最小化托盘是将ShowWindow的第二个参数设置成SW_HIDE(隐藏窗口)
最小化托盘结构 NOTIFYICONDATA
参数:
typedef
struct _NOTIFYICONDATA {
DWORD cbSize; //托盘结构的大小
HWND hWnd; //窗口的句柄
UINT uID; //父窗口的ID
UINT uFlags; //起作用的成员
UINT uCallbackMessage; //托盘消息
HICON hIcon; //图标句柄
TCHAR szTip[64]; //成员起作用
DWORD dwState; //指明dwState成员的那些位可以被设置或者访问
DWORD dwStateMask;
TCHAR szInfo[256]; //气泡提示的内容
TCHAR szInfoTitle[64];
DWORD dwInfoFlags; //气泡提示的标题
GUID guidItem;
HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
在使用之前需要写一个函数用于处理音乐播放器的托盘消息
//处理托盘消息 void ToTray(HWND hwnd,int flag)
定义一个托盘消息
#define WM_SHOWTASK (WM_USER + 100) /*自定义消息,用于托盘图标响应鼠标消息*/
然后就是写代码(处理托盘结构代码)
//得到父窗口的句柄 HWND hwnd1 = FindWindow(NULL,TEXT("音乐播放器")); //传递托盘结构 NOTIFYICONDATA nid; //结构体清零 ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); //托盘结构的大小 nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); //父窗口的句柄 nid.hWnd = hwnd1; //父窗口的ID nid.uID = IDD_MAIN; //起作用的成员: hIcon uCallbackMessage szTip nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; //在托盘中显示音乐播放器的名字 wsprintf(nid.szTip ,"%s",TEXT("音乐播放器")); //程序自定义的消息标示符 nid.uCallbackMessage = WM_SHOWTASK; /*增加、修改或删除图标句柄*/ nid.hIcon = LoadIcon( (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1);
void ToTray(HWND hwnd,int flag)函数
/处理托盘消息 void ToTray(HWND hwnd,int flag) { //得到父窗口的句柄 HWND hwnd1 = FindWindow(NULL,TEXT("音乐播放器")); //传递托盘结构 NOTIFYICONDATA nid; //结构体清零 ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); //托盘结构的大小 nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); //父窗口的句柄 nid.hWnd = hwnd1; //父窗口的ID nid.uID = IDD_MAIN; //起作用的成员: hIcon uCallbackMessage szTip nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; //在托盘中显示音乐播放器的名字 wsprintf(nid.szTip ,"%s",TEXT("音乐播放器")); //程序自定义的消息标示符 nid.uCallbackMessage = WM_SHOWTASK; /*增加、修改或删除图标句柄*/ nid.hIcon = LoadIcon( (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1)); switch(flag) { //音乐播放器最小化托盘 case 1: { //关闭退出对话框 EndDialog(hwnd,0); //隐藏窗口 ShowWindow(hwnd1,SW_HIDE); } break; //还原音乐播放器 case 2: { //显示窗口 ShowWindow(hwnd1,SW_SHOW); } break; //退出音乐播放器 case 3: { Main_OnClose(hwnd1); } break; //在托盘上显示图标 case 4: { Shell_NotifyIcon(NIM_ADD,&nid); } break; //删除托盘图标 case 5: { Shell_NotifyIcon(NIM_DELETE,&nid); } break; default: break; } }
运行效果
自己动手开发音乐播放器(三)最小化托盘,布布扣,bubuko.com
原文:http://blog.csdn.net/u010105970/article/details/20624915