如何在系统托盘上动态图标的实现

本文介绍了如何在系统托盘区域创建动态图标,通过使用NOTIFYICONDATA结构和Shell_NotifyIcon函数,以及在Delphi中处理WM_SHELLNOTIFY消息来响应图标事件。同时,文章还展示了如何实现类似Windows开始菜单中菜单左侧的图片效果,通过窗体模拟菜单,利用TrayIcon控件和ImageList实现动态图标切换。

一个数据结构NOTIFYICONDATA  
一个调用函数Shell_NotifyIcon  
   
   
  NotifyIconData.cbSize   =   sizeof(NOTIFYICONDATA);  
  NotifyIconData.hIcon   =   要使用的图标句柄  
  NotifyIconData.hWnd   =   父窗口句柄;  
  NotifyIconData.szTip,指向要提示的信息  
                                      可以这样      
                                      strcpy(NotifyIconData.szTip,"提示信息");  
  NotifyIconData.uCallbackMessage   =   WM_SHELLNOTIFY;回调的的消息  
  NotifyIconData.uFlags   =   NIF_ICON   |   NIF_MESSAGE   |   NIF_TIP;  
  NotifyIconData.uID   =   1;  
                                      NIM_ADD-增加,NIM_DEL删除托盘小图标  
  Shell_NotifyIcon(NIM_ADD,&NotifyIconData);
Top

2 楼
  BEGIN_MESSAGE_MAP(CMainFrame,   CFrameWnd)  
  //{{AFX_MSG_MAP(CMainFrame)  
  ON_WM_CREATE()  
  ON_WM_DESTROY()  
  //}}AFX_MSG_MAP  
  ON_MESSAGE(WM_SHELLNOTIFY,OnShellNotify)//加入这行代码  
  END_MESSAGE_MAP()  
   
  在.h   加入函数的声明  
  protected:  
  //{{AFX_MSG(CMainFrame)  
  afx_msg   int   OnCreate(LPCREATESTRUCT   lpCreateStruct);  
  afx_msg   void   OnDestroy();  
  //}}AFX_MSG  
  LRESULT     OnShellNotify(WPARAM   wParam,LPARAM   lParam);//加入这行代码  
  DECLARE_MESSAGE_MAP()  
   
  在.cpp   中加入函数体  
   
  LRESULT   CMainFrame::OnShellNotify(WPARAM   wParam,LPARAM   lParam)   //图标响应事件  
  {  
   
      if   (lParam   ==   WM_RBUTTONDOWN)  
      {  
          switch(wParam)  
        {  
                  case   IDR_MAINFRAME:  
                ...  
        }  
      }  
  }  
  其中wParam   是图标的ID号  
  lParam是事件

 

 

 

 

 

如何在托盘图标实现漂亮的菜单

 

  今日看到一个帖子问:如何在托盘图标实现象window开始菜单中菜单左侧的图片效果。于是自己动手做了一个。
  我的思路是不用菜单,用窗体来实现(我想不仅是delphi其他编程语言应该一样可以)。
  例子中我用到了一个第三方控件:Trayicon用来显示动态托盘图标(下载地址:http://2ccc.com/article.asp?articleid=1985)。请看我如下步骤:
  1.新建立一个project,同时建立两个窗体Form1和iconform。其中第二个用来显示托盘图标菜单。
  2.各放置一个Trayicon、imagelist和Applicationevents控件于Form1上。
  3.加入合适的图标到imagelist,然后在trayicon的属性编辑器中的icon项关联imagelist。(如果你加入了多个图标,你可以把trayicon的animate设置为true,可以看见动态图标,trayicon控件包里有DEMO)
  4.将trayicon的popupmenuon属性设置为imnone;visible设置为true。
  5.在trayicon的mouseup事件中写:
var
  APoint: TPoint;
begin
  GetCursorPos(APoint);
  if (Screen.ActiveForm <> nil) and (Screen.ActiveForm.Handle <> 0) then
    SetForegroundWindow(Screen.ActiveForm.Handle);

  if iconform.Width + apoint.X <= screen.Width then
    iconform.left:=APoint.X
  else
    iconform.Left:=APoint.X - FORM2.Width;

  iconform.Top:=apoint.Y - FORM2.Height;
  iconform.Show;
end;
  6.在applicationevents的deactivate事件中写:
iconform.Close;
  7.在iconform上放置两个标签label_restore,label_exit
  8.在iconform的deactivate事件中写: close;
  9.在label_restore的click事件中写: form1.trayicon1.Restore;
     在label_exit的click事件中写: Application.Terminate;
  10.至此,编程工作已经完成,运行后点击托盘图标看看效果如何。你可以在iconform上作你想作的事情,不用说图片,在form上你可以作的事情就太多了。

 

 

 

如何在系统托盘上动态图标的实现
 
hc360慧聪网教育行业频道 2004-08-12 09:54:56
 
 
近日编写一个局域网聊天软件,最初的愿望是程序启动后,直接最小化为图标,存放于系统托盘上。程序做出来后来觉得静态图标不新鲜,能否搞一个动态图标呢?经过努力,在原来程序的基础上,添加了一些代码,终于实现,现奉献给大家。
首先,用Delphi自带的工具软件Image Editor(在Tools目录中)打开本项目的资源文件(本例是lt.res),增加图标,并编辑好它们的内容,分别命名为mainicon1,mainicon2,……然后在Delphi中关闭全部(close all),重新打开项目。该步骤的目的是读入改变过的资源文件。
其次,声明一整数型全局变量count_i,在窗体的OnCreate事件中加入count_i:=0;代码。在窗体中加入一定时器控件Timer1对象,其Enabled属性设为False,Interval属性值设置要大一点,否则图标变化速度太快,在其OnTimer事件中加入如下代码(my_tray_icon是事先声明的一个tnotifyicondata型私有变量):
if count_i>2 then count_i:=0;
    count_i:=count_i+1;
    with my_tray_icon do
    begin
      cbsize:=sizeof(tnotifyicondata);
      wnd:=handle;
      uid:=1;
      uflags:=nif_message or nif_icon or nif_tip;
      ucallbackmessage:=wm_traynotify;
      case count_i of
         1: hicon:=loadicon(hinstance,<|>mainicon<|>);
         2:hicon:=loadicon(hinstance,<|>mainicon2<|>);
         3:hicon:=loadicon(hinstance,<|>mainicon1<|>);
      end;
      sztip:=<|>局域网聊天<|>;
    end;
shell_notifyicon(nim_modify,@my_tray_icon);
最后,在窗体的OnCreate事件中加入Timer1.Enabled:=true;代码。
 
 

trayicon类的使用 //新建一个基于单文档的工程 //将trayicon类引入工程,并引入图标作为动态显示用 //在工程中新建一个菜单ID为IDR_TRAYPOPUP,添加两个命令ID:ID_SHOWWINDOW 和 ID_HIDEWINDOW //并利用类向导在CMainFrame类中为它们添加命令处理函数 void CMainFrame::OnShowwindow() { // 显示窗口 this->ShowWindow(SW_SHOW); } void CMainFrame::OnHidewindow() { // 隐藏窗口 this->ShowWindow(SW_HIDE); } //在类CMainFrame头文件前添加 #include "ntray.h" #define MAXICONS (int)9 //定义图标的最大数目,具体工程具体修改数目 #define DELAY (DWORD)100 //定义动画图标的时间延迟 //在DECLARE_MESSAGE_MAP()前添加自定义消息 afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam); //声明trayicon类对象 CTrayNotifyIcon m_TrayIcon; //声明图标数组 HICON m_hIcons[MAXICONS]; //在CMainFrame的实现文件中添加消息宏ID #define WM_TRAYNOTIFY (WM_USER + 100) //在BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 和 END_MESSAGE_MAP()之间添加消息映射 ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotification) //在CMainFrame的实现文件中定义消息处理函数 LRESULT CMainFrame::OnTrayNotification(WPARAM wParam, LPARAM lParam) { //Delegate all the work back to the default implementation in //CTrayNotifyIcon. return m_TrayIcon.OnTrayNotification(wParam, lParam); } //在CMainFrame的构造函数中添加icon的初始化代码 for (int i=0; i<MAXICONS; i++) { //任务栏图标,注意引入的图标的ID值为连续的,且IDI_ICON1的值为图标ID中最小的 m_hIcons[i] = AfxGetApp()->LoadIcon(IDI_ICON1 + i); } //在CMainFrame的OnCreate(LPCREATESTRUCT lpCreateStruct) 函数中添加 if (!m_TrayIcon.Create(this, IDR_TRAYPOPUP, _T("提示信息"), m_hIcons, MAXICONS, DELAY, WM_TRAYNOTIFY)) { AfxMessageBox(_T("Failed to create tray icon"), MB_OK | MB_ICONSTOP); return -1; } //在需要使用动态图标或静态图标处加入以下代码 if (m_TrayIcon.UsingAnimatedIcon())//判断是否处于动态显示状态 { m_TrayIcon.SetIcon(m_hIcons[0]);//设置通知区为静态图标 m_TrayIcon.SetTooltipText(_T("静止也美!")); } else { m_TrayIcon.SetIcon(m_hIcons, MAXICONS, DELAY);//设置通知区为动态图标 m_TrayIcon.SetTooltipText(_T("运动才美!")); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值