今天有兴致来这里写一些我最近的学习心得。希望和有兴趣的同学一起探讨一下。 我要写的是如何在最小化的时候将图标加到桌面的托盘区。 所谓的托盘区,就是桌面右下角那个区域。有一些小图标还有时间显示的那个角落。有时候我们的程序仅仅最小化到任务栏是不够的。如一些长时间运行的像定时关机程序。我们就可以把他最小化到托盘区。这样看起来特别的爽。 先讲一下基本原理:1.最小化:点击最小化按钮时。就在右下角绘一个小图标。然后将整个窗口隐藏掉。 2.还原:双击小图标后,触发程序中定义的消息,将隐藏的窗口重新显示出来。再将那个小图标删掉就行啦。 呵呵,很简单吧。首先来看看点击最小化按钮时触发的函数吧:我们可以定义一个函数Main_OnSysCommand(HWND hwnd,UINT hit,int x,int y);第一个参数是窗口句柄不用我多说了。第二个参数是监控你点击的行为的。比如可选值:SC_MINIMIZE,你点击了最小化,操作系统就把这个参数传进来。还有SC_MAXMIZE;第三四个参数我也不懂。(知道的同学要告诉我哦,我很菜的。) 要加到窗口进程函数:BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)中去。即加上这一句:HANDLE_MSG(hWnd,WM_SYSCOMMAND,Main_OnSysCommand); WM_SYSCOMMAND是监控最大化最小化按钮的:处于待命状态。一旦你点击了就触发函数。Main_OnSyscommand; 在Main_OnSyscommand里面就要响应添加图标到托盘了;要用到函数:Shell_NotifyIcon(NIM_ADD,&nid); 第一个函数是经过宏定义的常数NIM_DELETE,就是删除图标。第二个参数是关于对图标进行一系列操作的变量。是一个结构体类型的 变量NOTIFYICONDATA nid;看看他在系统里面的定义吧: typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
下面就对该结构各个参数进行刨析: cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。 HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。自然了,在SDK编程中都直接传hwnd就行了。 uID : 在工程中定义的图标ID uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述 hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( HINSTANCE ,MAKEINTRESOURCE (IDR_MAINFRAME) )。 第一个是窗口的实例句柄。可用GetWindowLong();取得。 uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。 szTip : 鼠标移动到托盘图标上时的提示文字。 当然还有一些成员我没有引进来,大家可以通过在vc6的工具中调至定义看看了。 这里说一下隐藏显示窗口的函数:ShowWindow(hwnd,SW_HIDE);第一个是窗口句柄,第二个参数是具体的功能的参数。如果是SW__SHOWNORMAL就是恢复正常了。 自定义消息是很重要的,#define WM_ICONMSG (WM_USER+1) //所谓的自定义消息,监控托盘的图标的行为。 下面一段代码是要加到窗口进程函数: BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)中去的。具体的通过点图标来实现还原的代码: case WM_ICONMSG:
{
if(wParam==IDR_ICON)
{
switch(lParam)
{
case WM_LBUTTONDBLCLK: //如果双击了图标就执行下面的;
{
ShowWindow(hWnd,SW_SHOWNORMAL);
Shell_NotifyIcon(NIM_DELETE,&nid);
}
break;
default:break;
}
}
附加一段代码吧:void MinToPray(HWND hwnd)
{
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd=hwnd;
nid.hIcon=LoadIcon((HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),MAKEINTRESOURCE(IDR_ICON));
nid.uID=IDR_ICON;
nid.uFlags=NIF_INFO|NIF_ICON|NIF_TIP|NIF_MESSAGE;
nid.uCallbackMessage=WM_ICONMSG; //这里填自定义的消息。
nid.dwInfoFlags = NIIF_INFO;
lstrcpy(nid.szTip,TEXT("自动关机程序,双击图标还原窗口。"));
lstrcpy(nid.szInfo,TEXT("冒个泡泡看看。"));
lstrcpy(nid.szInfoTitle,TEXT("双击可还原!"));
Shell_NotifyIcon(NIM_ADD,&nid);
}
|