最小化图标到托盘

最小化图标到托盘
 

    今天有兴致来这里写一些我最近的学习心得。希望和有兴趣的同学一起探讨一下。

   我要写的是如何在最小化的时候将图标加到桌面的托盘区。

所谓的托盘区,就是桌面右下角那个区域。有一些小图标还有时间显示的那个角落。有时候我们的程序仅仅最小化到任务栏是不够的。如一些长时间运行的像定时关机程序。我们就可以把他最小化到托盘区。这样看起来特别的爽。

先讲一下基本原理: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;里面有很多高手和优秀的老师指教,本人也从中获益良多啊!

作者:GY小小鸟
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/YangFengHui/p/2018577.html