其实最小化托盘的原理不难理解,当用户选择最小化托盘时,程序并没有到托盘里,只是使用 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