如 何 在 任 务 栏 上 显 示 图 标

  ----   Windows95/WindowNT   任   务   栏   的   右   边   是   一   状   态   区,Windows95/WindowsNT   在   其   上   显   示   时   间   和   一   些   小   图   标,   这   些   图   标   代   表   着   特   定   的   功   能   或   程   序,   用   鼠   标   单   击、   右   击   或   双   击   这   些   图   标,   就   会   弹   出   功   能   菜   单   或   程   序   窗   口   等。   如   你   用   过   金   山   词   霸   或   超   级   解   霸,   你   会   觉   得   这   些   图   标   使   软   件   用   起   来   很   方   便。   你   也   许   想   把   自   己   的   程   序   图   标   也   放   在   任   务   栏   的   状   态   区   上,   很   简   单,Visual   C++   5.0   提   供   了   一   个   函   数,   让   你   很   容   易   地   实   现   该   功   能。    
   
  ----   Visual   C++   提   供   的   函   数   是Shell_NotifyIcon(),   该   函   数   发   送   消   息   给   系   统   在   任   务   栏   的   状   态   区   增   加、   删   除   或   修   改   图   标。Shell_NotifyIcon()   有   两   个   参   数:    
   
  ----   1   .   DWORD   dwMessage    
   
  ----   消   息   标   志   值,   为   以   下   三   个   中   之   一:    
   
  NIM_ADD     在任务栏状态区增加图标  
  NIM_DELETE从任务栏状态区删除图标  
  NIM_MODITY修改任务栏状态区的图标  
   
  ----   2   .   PNOTIFYICONDATA   pnid    
   
  ----   指   向NOTIFYICONDATA   结   构   的   指   针。NOTIFYICONDATA   结   构   如   下:    
   
  typedef   struct   _NOTIFYICONDATA   {   //   nid  
  DWORD   cbSize;   //   NOTIFYICONDATA结构的大小  
  HWND   hWnd;   //接收回调消息的窗口句柄  
  UINT   uID;     //自定义的图标标志值  
  UINT   uFlags;   //标志后面的三个数据成员哪个有效,  
  //可由NIF_ICON,NIF_MESSAGENIF_TIP组合。  
  UINT   uCallbackMessage;     //回调消息  
  HICON   hIcon;     //图标句柄  
  char   szTip[64];     //提示字符。当把鼠标移到任务栏  
                              //状态区该图标上时,系统显示该字符  
              }   NOTIFYICONDATA,   *PNOTIFYICONDATA;  
   
  ----   以   下   举   例   如   何   在   任   务   栏   状   态   区   实   现   程   序   图   标   及   其   功   能。    
   
  ----   1.   首   先   生   成   一   个   单   文   档   的   工   程   文   件。    
   
  ----   2.   StdAfx.h   添   加   自   定   义   的   消   息:    
   
  //回调消息  
  #define   MYWM_NOTIFYICON     WM_USER+1  
  //在任务栏状态区显示图标的消息  
  #define   MYWM_SHOWAPPICONIC     WM_USER+2  
   
  ----   3.   MainFrm.h   里   添   加   定   义   消   息   处   理   函   数   说   明,   该   部   分   看   起   来   如   下:    
   
  protected:  
  //{{AFX_MSG(CMainFrame)  
  afx_msg   void   OnSysCommand(   UINT   nID,   LPARAM   lParam   );    
  //   手   工   加  
  afx_msg   void   OnMyIconNotify(   WPARAM   wParam,   LPARAM   lParam   );    
  //   手   工   加  
  afx_msg   void   OnShowAppIconic(   WPARAM   wParam,   LPARAM   lParam   );    
  //   手   工   加  
  afx_msg   void   OnClose();    
  //   系   统   生   成  
  //}}AFX_MSG  
   
  DECLARE_MESSAGE_MAP()  
   
  ----   另   外,   需   在MainFrm.h   定   义   一   开   关   值,   记   录   程   序   窗   口   是   打   开   或   关   闭   状   态:    
   
  BOOL   boolWndHadShow;  
   
  ----   4.   MainFrm.cpp   里   实   现   消   息   映   射   和   消   息   处   理   函   数。   消   息   映   射   部   分   看   起   来   如   下:    
   
  BEGIN_MESSAGE_MAP(CMainFrame,   CFrameWnd)  
          //{{AFX_MSG_MAP(CMainFrame)  
          ON_MESSAGE(MYWM_NOTIFYICON,   OnMyIconNotify)  
          ON_MESSAGE(MYWM_SHOWAPPICONIC,   OnShowAppIconic)  
          ON_WM_SYSCOMMAND()  
          ON_WM_CLOSE()  
          //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
  ----   消   息   处   理   及   相   关   函   数   如   下   所   示:    
   
  //在任务栏状态区添加图标  
  BOOL   MyTaskBarAddIcon(HWND   hwnd,    
  UINT   uID,   HICON   hicon,   LPSTR   lpszTip)    
  {    
          BOOL   res;    
          NOTIFYICONDATA   tnid;    
          tnid.cbSize   =   sizeof(NOTIFYICONDATA);    
          tnid.hWnd   =   hwnd;    
          tnid.uID   =   uID;          
          tnid.uFlags   =   NIF_ICON   ¦   NIF_TIP   ¦   NIF_MESSAGE;    
          tnid.uCallbackMessage   =   MYWM_NOTIFYICON;    
          tnid.hIcon   =   hicon;    
          if   (lpszTip)    
  lstrcpyn(tnid.szTip,   lpszTip,   sizeof(tnid.szTip));    
          else                  
                  tnid.szTip[0]   =   '/0';      
          res   =   Shell_NotifyIcon(NIM_ADD,   &tnid);    
          if   (hicon)    
                  DestroyIcon(hicon);    
          return   res;    
  }    
   
  //从任务栏状态区删除图标  
  BOOL   MyTaskBarDeleteIcon(HWND   hwnd,   UINT   uID)    
  {          
          BOOL   res;    
          NOTIFYICONDATA   tnid;    
          tnid.cbSize   =   sizeof(NOTIFYICONDATA);    
          tnid.hWnd   =   hwnd;  
          tnid.uID   =   uID;    
          res   =   Shell_NotifyIcon(NIM_DELETE,   &tnid);    
          return   res;    
  }      
   
  //处理图标回调消息MYWM_NOTIFYICON  
  void   CMainFrame::OnMyIconNotify  
  (   WPARAM   wParam,   LPARAM   lParam   )  
  {  
          UINT   nID;  
          UINT   uMouseMsg;    
          nID   =   (UINT)wParam;  
          uMouseMsg   =   (UINT)   lParam;    
          if   (uMouseMsg   ==   WM_LBUTTONDOWN)   //点击图标  
          {    
                  if   (   boolWndHadShow   )     //如果窗口已打开,隐藏窗口  
                          ShowWindow(   SW_HIDE   );  
                  else                             //否则,显示窗口  
                          ShowWindow(   SW_SHOWNORMAL   );  
                  boolWndHadShow   =   ~boolWndHadShow;  
          }  
  }  
   
  //消息MYWM_SHOWAPPICONIC  
  处理函数,在任务栏显示图标并隐藏窗口  
  void   CMainFrame::OnShowAppIconic  
  (   WPARAM   wParam,   LPARAM   lParam   )  
  {  
  HICON   theIcon   =   LoadIcon(AfxGetInstanceHandle(),    
  MAKEINTRESOURCE(IDR_MAINFRAME)   );  
  MyTaskBarAddIcon(GetSafeHwnd(),   100,   theIcon,   _T("示范程序"));  
  ShowWindow(   SW_HIDE   );  
  boolWndHadShow   =   FALSE;  
  }  
   
  ----   当   程   序   关   闭   时,   需   把   图   标   从   任   务   样   状   态   区   删   除,   你   可   以   添   加   一   个   处   理WM_CLOSE   消   息   的   函   数   来   删   除   图   标。   通   过ClassWizard   来   添   加   处   理WM_CLOSE   的   函   数OnClose(),   该   函   数   如   下:    
   
  void   CMainFrame::OnClose()    
  {  
          //   TODO:   Add   your   message   handler    
          code   here   and/or   call   default  
          MyTaskBarDeleteIcon(   GetSafeHwnd(),   100   );  
          CFrameWnd::OnClose();  
  }  
   
  ----   当   用   户   把   窗   口   最   小   化   时,   你   应   隐   藏   整   个   窗   口,   所   以   要   处   理ON_SYSCOMMAND   消   息。   首   先   在MainFrm.h   添   加   函   数   说   明,   如   第3   步   所   示;   然   后   在MainFrm.cpp   里   说   明   消   息   映   射   和   实   现   函   数。   消   息   映   射   如   前   面   所   示,   函   数   实   现   如   下:    
   
  void   CMainFrame::OnSysCommand  
  (   UINT   nID,   LPARAM   lParam   )  
  {  
          if   (   nID==SC_MINIMIZE     )  
          {  
                  ShowWindow(   SW_HIDE   );  
                  boolWndHadShow   =   FALSE;  
          }  
          else  
                  CWnd::OnSysCommand(   nID,   lParam   );  
  }  
   
  ----   5.   InitInstance()   函   数   返   回   前,   添   加   一   语   句    
   
                  m_pMainWnd-   >PostMessage(   MYWM_SHOWAPPICONIC   );  
   
  ----   它   是   发   送   一   个   自   定   义   的   消   息MYWM_SHOWAPPICONIC   使   程   序   启   动   后   隐   藏   程   序   窗   口   并   在   任   务   栏   状   态   区   显   示   小   图   标。    
   
  ----   6.   现   在,   你   可   编   译   和   运   行   该   程   序   了。   程   序   运   行   后,   点   击   任   务   栏   状   态   区   该   程   序   的   图   标,   系   统   会   弹   出   程   序   窗   口,   再   点   击   一   下,   又   隐   藏   了。   怎   么   样,   象   不   象   金   山   词   霸   ?    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值