2009/05/20 | 托盘 定时器中改图
类别(语言类学习笔记) | 评论(0) | 阅读(407) | 发表于 17:00

托盘实现,你只要在定时器中改图,就可以实现让它动了,就象qq一样。  
  下面是托盘技术  
  一、     实现步骤          
  1.     创建一个应用程序,在主窗体上增加一个TpopupMenu组件。并为该弹出菜单组件增加菜单项Exit,标题为“退出”。          
  2.     在Uses中添加ShellAPI,因为在系统状态栏中增加图标时需调用ShellAPI函数Shell_NotifyIconA。该函数需要2个参数,其中一个是TnotifyIconDataA结构,需在主窗体中增加TnotifyIconDataA类型全局变量ntida。          
  3.     定义消息mousemsg,并编写主窗体的mousemessage消息处理函数,此函数说明在图标上用鼠标左键单击时,会打开应用程序窗口;用鼠标右键单击时,会弹出一个菜单。          
  下面给出步骤2和3的实现代码:          
  unit     Unit1;          
  interface          
  uses          
  Windows,     Messages,     SysUtils,     Classes,     Graphics,     Controls,     Forms,     Dialogs,          
  StdCtrls,     ExtCtrls,     Menus,     shellapi;          
         
  const          
  mousemsg     =     wm_user     +     1;     //自定义消息,用于处理用户在图标上点击鼠标的事件          
  iid     =     100;     //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用。          
         
  type          
  TForm1     =     class(TForm)          
  ......          
  private          
  //自定义消息处理函数,处理鼠标点击图标事件          
  procedure     mousemessage(var     message:     tmessage);     message     mousemsg;              
  public          
  {     Public     declarations     }          
  end;          
         
  var          
  Form1:     TForm1;          
  ntida:     TNotifyIcondataA;     //用于增加和删除系统状态图标          
  implementation          
         
  {$ R     *.DFM}          
         
  procedure     TForm1.mousemessage(var     message:     tmessage);          
  var          
  mousept:     TPoint;     //鼠标点击位置          
  begin          
  inherited;          
  if     message.LParam     =     wm_rbuttonup     then     begin     //用鼠标右键点击图标          
  getcursorpos(mousept);     //获取光标位置          
  popupmenu1.popup(mousept.x,     mousept.y);     //在光标位置弹出菜单          
  end;          
  if     message.LParam     =     wm_lbuttonup     then     begin     //用鼠标左键点击图标          
  //显示应用程序窗口          
  ShowWindow(Handle,     SW_SHOW);          
  //在任务栏上显示应用程序窗口          
  ShowWindow(Application.handle,     SW_SHOW);          
  SetWindowLong(Application.Handle,     GWL_EXSTYLE,          
  not     (GetWindowLong(Application.handle,     GWL_EXSTYLE)          
  or     WS_EX_TOOLWINDOW     AND     NOT     WS_EX_APPWINDOW));          
  end;          
  message.Result     :=     0;          
  end          
  4.     编辑TForm1.FormCreate(Sender:     TObject)          
  应用程序开始运行时,在系统状态栏上生成图标显示,代码如下:          
  procedure     TForm1.FormCreate(Sender:     TObject);          
  begin          
  ntida.cbSize     :=     sizeof(tnotifyicondataa);     //指定ntida的长度          
  ntida.Wnd     :=     handle;     //取应用程序主窗体的句柄          
  ntida.uID     :=     iid;     //用户自定义的一个数值,在uCallbackMessage参数指定的消息中使用          
  ntida.uFlags     :=     nif_icon     +     nif_tip     +     nif_message;//指定在该结构中uCallbackMessage、hIcon、szTip参数都有效          
  ntida.uCallbackMessage     :=     mousemsg;//指定的窗口消息          
  ntida.hIcon     :=     Application.Icon.handle;//指定系统状态栏显示应用程序的图标句柄          
  ntida.szTip     :=     'Icon';     //当鼠标停留在系统状态栏该图标上时,出现该提示信息          
  shell_notifyicona(NIM_ADD,     @ntida);     //在系统状态栏增加一个新图标          
  end;          
  5.     编辑Tform1.OnClose          
  当用户关闭应用程序窗口时,该窗口和任务栏上相应的应用程序窗口都消失,但程序并没有退出。代码如下:          
  procedure     TForm1.FormClose(Sender:     TObject;     var     Action:     TCloseAction);          
  begin          
  Action     :=     caNone;     //不对窗体进行任何操作          
  ShowWindow(Handle,     SW_HIDE);     //隐藏主窗体          
  //隐藏应用程序窗口在任务栏上的显示          
  ShowWindow(Application.Handle,     SW_HIDE);          
  SetWindowLong(Application.Handle,     GWL_EXSTYLE,          
  GetWindowLong(Application.handle,     GWL_EXSTYLE)          
  or     WS_EX_TOOLWINDOW     AND     NOT     WS_EX_APPWINDOW);          
  end;          
  6.     编辑弹出菜单Exit          
  当用户点击该菜单时完全退出应用程序。代码如下:          
  procedure     TForm1.ExitClick(Sender:     TObject);          
  begin          
  //为ntida赋值,指定各项参数          
  ntida.cbSize     :=     sizeof(tnotifyicondataa);          
  ntida.wnd     :=     handle;          
  ntida.uID     :=     iid;          
  ntida.uFlags     :=     nif_icon     +     nif_tip     +     nif_message;          
  ntida.uCallbackMessage     :=     mousemsg;          
  ntida.hIcon     :=     Application.Icon.handle;          
  ntida.szTip     :=     'Icon';          
  shell_notifyicona(NIM_DELETE,     @ntida);     //删除已有的应用程序图标          
  Application.Terminate;     //中断应用程序运行,退出应用程序          
  end;          
     
  ---------------------------------------------------------------      
     
  const     WM_MYTRAYICONCALLBACK     =     WM_USER     +     1000;      
     
  type      
        TForm1     =     class(TForm)      
                ...      
                n_MainFromDispOrHide:     TMenuItem;      
        private      
                {     Private     declarations     }      
                MyTrayIcon     :     TNotifyIconData;             //定义一个托

0

评论Comments