VC托盘气泡做法

来源:互联网 发布:简历熟悉办公软件 编辑:程序博客网 时间:2024/06/12 01:27
使用VC和VB对系统托盘编程的方法  
  Windows下许多程序都在系统托盘——屏幕右下角(Windows时间、输入法显示位置)显示程序图标,比如金山词霸、PC-cillin、SQL   Server等,如何进行少量编程实现这一功能?WinApi提供了一个函数,帮助实现系统托盘图标的显示、删除、闪动等。在此,作者根据自己的实际经验提供在Visual   Basic和Visual   C++下的编程方法。  
  一、   WinApi的Shell_NotifyIcon函数介绍  
  WINSHELLAPI   BOOL   WINAPI   Shell_NotifyIcon(  
          DWORD   dwMessage,    
          PNOTIFYICONDATA   pnid);  
  参数说明:  
  DWORD     dwMessage   有三个选择:  
  0——NIM_ADD           在系统托盘加上图标    
  1——NIM_DELETE     删除系统托盘上的图标  
  2——NIM_MODIFY     更换系统托盘上的图标  
  pnid是PNOTIFYICONDATA数据类型,包括  
  PNOTIFYICONDATA数据结构如下:  
  typedef   struct   _NOTIFYICONDATA   {    
          DWORD   cbSize;                                                                             //本数据结构的字节数  
          HWND   hWnd;                                                       //图标所属的Windows程序窗口句柄  
          UINT   uID;    
                  UINT   uFlags;             //让图标变量NIF_ICON   、鼠标移动到图标处的事件变量             NIF_TIP、信息变量NIF_MESSAGE有效  
          UINT   uCallbackMessage;               //在图标位置的发生鼠标事件时向程序发送的消息  
          HICON   hIcon;                                                                                                     //图标指针  
  char   szTip[64];                                         //当鼠标移动到图标位置时,自动显示的文字  
   
                                                                //这就是你所说的气泡  
  }   NOTIFYICONDATA,   *PNOTIFYICONDATA;  
   
  二、在Visual   Basic下的使用方法  
  1、   声明  
  Option   Explicit  
  Private   Type   NOTIFYICONDATA         '   定义NOTIFYICONDATA数据类型  
          cbSize   As   Long  
          hWnd   As   Long  
          uId   As   Long  
          uFlags   As   Long  
          ucallbackMessage   As   Long  
          hIcon   As   Long  
          szTip   As   String   *   64  
  End   Type  
  '   定义对图标操作的常量  
  Private   Const   NIM_ADD   =   &H0     '   增加图标  
  Private   Const   NIM_MODIFY   =   &H1   '   改变图标  
  Private   Const   NIM_DELETE   =   &H2     '   删除图标  
  '   以下定义鼠标事件常量  
  Private   Const   WM_MOUSEMOVE   =   &H200     '   鼠标移动常量  
  Private   Const   WM_LBUTTONDBLCLK   =   &H203       '   双击左鼠标按钮  
  Private   Const   WM_LBUTTONDOWN   =   &H201           '   左鼠标按钮按下  
  Private   Const   WM_LBUTTONUP   =   &H202               '   松开左鼠标按钮  
  Private   Const   WM_RBUTTONDBLCLK   =   &H206       '   双击右鼠标按钮  
  Private   Const   WM_RBUTTONDOWN   =   &H204           '   右鼠标按钮按下  
  Private   Const   WM_RBUTTONUP   =   &H205               '   松开右鼠标按钮  
  Private   Const   NIF_MESSAGE   =   &H1  
  Private   Const   NIF_ICON   =   &H2  
  Private   Const   NIF_TIP   =   &H4  
  '   WinApi函数Shell_NotifyIcon声明  
  Private   Declare   Function   Shell_NotifyIcon   Lib   "shell32"   Alias   "Shell_NotifyIconA"   (ByVal   dwMessage   As   Long,   pnid   As   NOTIFYICONDATA)   As   Boolean  
  '   定义NOTIFYICONDATA类型变量  
  Dim   t   As   NOTIFYICONDATA  
  2、   方法  
  '   当程序运行时对变量t的赋值  
  Private   Sub   Form_Load()  
          t.cbSize   =   Len(t)  
          t.hwnd   =   Form1.hwnd  
          t.uId   =   1&  
          t.uFlags   =   NIF_ICON   Or   NIF_TIP   Or   NIF_MESSAGE  
          t.ucallbackMessage   =   WM_MOUSEMOVE  
          't.ucallbackMessage   =   WM_LBUTTONUP  
          t.hIcon   =   Form1.Icon  
          t.szTip   =   "这是我的系统托盘程序"  
  End   Sub  
  '   鼠标对图标操作事件的处理——体现在鼠标移动事件上  
  Private   Sub   Form_MouseMove(Button   As   Integer,   Shift   As   Integer,   x   As   Single,   Y   As   Single)  
          Dim   msg   As   Long  
          Dim   sFilter   As   String  
          msg   =   x   /   Screen.TwipsPerPixelX     '鼠标按下时的按钮信息  
          Select   Case   msg  
                Case   WM_LBUTTONDOWN   '   左鼠标按下事件  
                          Me.Show   '   单击图标时显示程序窗口  
                Case   WM_LBUTTONUP   '   左鼠标松开事件  
                Case   WM_LBUTTONDBLCLK   '   左鼠标双击事件  
                Case   WM_RBUTTONDOWN   '   右鼠标按下事件  
                          Me.PopupMenu   system     '   右鼠标按下时弹出菜单system是自定义的菜单  
                Case   WM_RBUTTONUP   '   右鼠标松开事件  
                Case   WM_RBUTTONDBLCLK     '   右鼠标双击事件  
          End   Select  
  End   Sub  
   
  3、   改变图标  
          Shell_NotifyIcon   NIM_DELETE,   t  
          If   t.hIcon   =   Form2.Icon   Then   t.hIcon   =   Form1.Icon   Else   t.hIcon   =   Form2.Icon  
  Shell_NotifyIcon   NIM_ADD,   t  
   
  三、   在Visual   C++下的使用方法  
  在Visual   C++下实现时可以不用声明,直接使用函数  
        在窗口显示事件时赋值变量,并显示系统托盘图标  
  void   ::OnShowWindow(BOOL   bShow,   UINT   nStatus)    
  {  
  ::OnShowWindow(bShow,   nStatus);  
  //   TODO:   Add   your   message   handler   code   here  
  if(nStatus){  
  BOOL   res;    
  NOTIFYICONDATA   tnid;    
          tnid.cbSize   =   sizeof(NOTIFYICONDATA);    
  tnid.hWnd   =m_hWnd;    
  tnid.uID   =   1;    
  tnid.uFlags   =   NIF_MESSAGE   |   NIF_ICON   |   NIF_TIP;    
  //tnid.uCallbackMessage   =   MYWM_NOTIFYICON;    
          tnid.hIcon   =   m_hIcon;    
                  strcpy(tnid.szTip,   "这是我的第一个系统托盘程序!/0");    
  res   =   Shell_NotifyIcon(NIM_ADD,   &tnid);    
    if   (m_hIcon)    
  DestroyIcon(m_hIcon);    
  }  
  }  
  其他操作类似Visual   Basic下的使用方法。
原创粉丝点击