今天有兴致来这里写一些我最近的学习心得。希望和有兴趣的同学一起探讨一下。
我要写的是如何在最小化的时候将图标加到桌面的托盘区。
所谓的托盘区,就是桌面右下角那个区域。有一些小图标还有时间显示的那个角落。有时候我们的程序仅仅最小化到任务栏是不够的。如一些长时间运行的像定时关机程序。我们就可以把他最小化到托盘区。这样看起来特别的爽。
先讲一下基本原理: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);
}
由于本人的文学水平差,表达不是很清楚。再加上很多技术上的问题,请大家多多指教!
友情链接:如鹏网:http://www.rupeng.com/forum/jian-2986.html;里面有很多高手和优秀的老师指教,本人也从中获益良多啊!