学习使用托盘程序

创建系统托盘图标,要用到NOTIFYICONDATA 结构体,先看看它的说明

typedef struct _NOTIFYICONDATA
{
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union
{
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
cbSize :结构体的大小,以字节为单位,常初始化为sizeof(NOTIFYICONDATA)
hWnd :窗口的句柄。标示的窗口用来接收与托盘图标相关的消息。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标
uID : 应用程序定义的任务栏图标的标识符。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标。通过将多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd
uFlags :此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)。此成员可以为以下值的组合:
   NIF_ICON :hIcon成员起作用。
   NIF_MESSAGE :uCallbackMessage成员起作用。
  NIF_TIP :szTip成员起作用。
  NIF_STATE :dwState和dwStateMask成员起作用。
  NIF_INFO :使用气球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成员起作用。
  NIF_GUID :保留。
uCallbackMessage :应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了消息事件发生的任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,例如当鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。
hIcon :增加、修改或删除的图标的句柄。注意,windows不同版本对于图标有不同要求。Windows XP可支持32位。
szTip :指向一个以/0结束的字符串的指针。字符串的内容为标准工具提示的信息。包含最后的/0字符,szTip最多含有64个字符。
               对于Version 5.0 和以后版本,szTip最多含有128个字符(包含最后的/0字符)。
dwState :Version 5.0,图标的状态,有两个可选值,如下:
             NIS_HIDDEN :  图标隐藏
            NIS_SHAREDICON :图标共享
dwStateMask :Version 5.0. 指明dwState成员的那些位可以被设置或者访问。比如设置此成员为NIS_HIDDEN,将导致只有hidden状态可以被获取。
szInfo :Version 5.0. 指向一个以/0结束的字符串的指针。字符串的内容为气球提示内容。最多含有255个字符。如果要移除已经存在的气球提示信息,设置uFlags成员为NIF_INFO,同时将szInfo设为空。
uTimeout :
          uTimeout :表示气球提示超时的时间,单位为毫秒,此时间后气球提示将消失。系统默认气球提示的超时时间最小值为10秒,最大值为30秒。如果设置的uTimeout的值小于10将设置最小值,如果大于30将设置最大值。
         uVersion:0表示使用Windows 95风格;1表示使用windows 2000 风格及以后的windows版本
szInfoTitle :Version 5.0. 指向一个以/0结束的字符串的指针。字符串的内容为气球提示的标题。此标题出现在气球提示框的上部,最多含有63个字符。
dwInfoFlags :Version 5.0. 设置此成员用来给气球提示框增加一个图标。增加的图标出现在气球提示标题的左侧,注意如果szInfoTitle成员设为空字符串,则图标也不会示。    可选值如下:
NIIF_ERROR :错误图标。
NIIF_INFO :信息图标。
NIIF_NONE :没有图标。
NIIF_USER :使用用户使用hIcon成员指明的图标,要求Windows XP Service Pack 2 (SP2)或以后系统。
NIIF_WARNING :警告图标。
NIIF_ICON_MASK :Version 6.0. 保留。
NIIF_NOSOUND :Version 6.0. 禁止播放相应声音。
guidItem :Version 6.0. 保留。

 

 

Shell_NotifyIcon 函数说明

此函数用来向任务栏托盘区域发送消息
1、函数格式 :BOOL Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA lpdata);
2、参数说明:dwMessage为输入参数,传递发送的消息,表明要执行的操作。可选的值如下:
NIM_ADD :向托盘区域添加一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示这个图标,以便以后再次使用shell_NotifyIcon对此      图标操作。
NIM_DELETE :删除托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被删除的这个图标。
NIM_MODIFY :修改托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA结构体中的hWnd和uID成员用来标示需要被修改的这个图标。
NIM_SETFOCUS :Version 5.0. 设置焦点。比如当用户操作托盘图标弹出菜单,而有按下ESC键将菜单消除后,程序应该使用此消息来将焦点设置到托盘图标上。
NIM_SETVERSION :Version 5.0. 设置任务栏按照第二个参数lpdata指向的NOTIFYICONDATA结构体中的uVersion成员指定的版本号来工作。此消息可以允许用户设置是否使用基于Windows2000的version 5.0的风格。uVersion的缺省值为0,默认指明了使用原始Windows 95图标消息风格。具体这两者的区别请参考msdn中的Shell_NotifyIcon函数说明的Remarks。
lpdata为输入参数,是指向NOTIFYICONDATA结构体的指针,结构体内容用来配合第一个参数wMessage进行图标操作。
3、返回值
如果图标操作成功返回TRUE,否则返回FALSE。
如果dwMessage参数设为NIM_SETVERSION,则如果版本设置成功返回TRUE,如果设置的版本不支持返回FALSE。

 

 

托盘实例程序

1,创建一个对话框程序CXXXDlg
2,在CXXXDlg.h中定义一个NOTIFYICONDATA结构体对象tnd
3,在CXXXDlg中为WM_CREATE添加消息响应函数OnCreate()
int CXXXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;
    tnd.cbSize=sizeof(NOTIFYICONDATA);
    tnd.hWnd=this->m_hWnd;
    tnd.uID=IDR_MAINFRAME; //用应用程序框架的图标做托盘图标
    tnd.uFlags=NIF_MESSAGE | NIF_ICON | NIF_TIP; //ICON, MESSAGE, TIP都起作用
    tnd.uCallbackMessage = WM_SHOWTASK; //托盘自己的消息响应函数,此消息需要自己定义
    HICON hIcon;
    hIcon = ::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
    tnd.hIcon= hIcon;
    CString szToolTip;
    szToolTip=_T("这是一个托盘程序");
    _tcscpy_s(tnd.szTip, szToolTip);
    Shell_NotifyIcon(NIM_ADD,&tnd);//向任务栏添加图标
    if( hIcon )
        ::DestroyIcon(hIcon);
}
4,在CXXXDlg.h中定义
       #define WM_SHOWTASK  WM_USER + 1 //接收托盘消息
      afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam); //托盘消息处理函数
5,在CXXXDlg.cpp中加入消息映射
BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
       …….
      ON_MESSAGE(WM_SHOWTASK,onShowTask)
      ……
END_MESSAGE_MAP()
6,手动编写onShowTask函数
LRESULT CXXXDlg::onShowTask(WPARAM wParam,LPARAM lParam)
{
  if(wParam!=IDR_MAINFRAME)  
  return   1;  
  switch(lParam)  
  {  
  case   WM_RBUTTONUP:  
  {  
     LPPOINT   lpoint=new   tagPOINT;  
     ::GetCursorPos(lpoint); CMenu   menu;  
     VERIFY(menu.LoadMenu(IDR_MENU_POP));  
     CMenu*   pPopup   =   menu.GetSubMenu(0);  
     ASSERT(pPopup   !=   NULL);  
     CWnd*   pWndPopupOwner   =   this;  
     while   (pWndPopupOwner->GetStyle()   &   WS_CHILD)  
     pWndPopupOwner   =   pWndPopupOwner->GetParent();  
     pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,   lpoint->x,  lpoint->y,   pWndPopupOwner);  
     delete   lpoint;  
  }   
  break;  
  case   WM_LBUTTONDBLCLK:  
  {  
     this->ShowWindow(SW_SHOW);  
     ShowWindow(SW_SHOWDEFAULT);  
  }  
  break;  
  }  
  return   0; 
}
7,当你的主程序退出时,一定要使用 :Shell_NotifyIcon(NIM_DELETE,&nid);  //在托盘区删除图标,一般用在OnCannel()中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值