我想在Timer1组件达到规定时间后,显示出“提醒事件”窗口,这个“提醒事件”窗口,我想做成:
        当Timer1组件达到规定时间后,在任务栏托盘区域显示闪烁图标,然后双击这个闪烁的图标,打开“提醒事件”窗口。我从朋友那里下载了一个例子,照着这个例子做后,目前只是做到点击SpeedButton1.Click后,显示在任务栏,但有一些不明白的地方和几个问题,代码如下:(本人菜鸟一只,只能将该单元的所有代码全部贴出来,大家帮我看看该怎么改写)unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;const WM_NID = WM_User + 1000;type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    Label1: TLabel;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure N1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    procedure WMNID(var msg:TMessage); message WM_NID;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementationuses ShellAPI;var
    NotifyIcon: TNotifyIconData;{$R *.dfm}procedure TForm1.WMNID(var msg:TMessage);
 var
   CursorPos: TPoint;
begin
 if msg.LParam = WM_RBUTTONDOWN then // 在托盘区点击左键后
 begin
   GetCursorPos(CursorPos);
   if IsIconIc(Application.Handle) then
     SetForegroundWindow(Application.Handle)
   else
     Application.BringToFront;   Application.ProcessMessages;
   PopupMenu1.Popup(CursorPos.x,CursorPos.y);
   PostMessage(Application.MainForm.Handle,WM_NULL,0,0);
 end;
end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 Shell_NotifyIcon(NIM_DELETE,@NotifyIcon)// 删除托盘图标
end;procedure TForm1.N1Click(Sender: TObject);
begin
  close;
end;procedure TForm1.FormShow(Sender: TObject);
begin
  with NotifyIcon do
  begin
    cbSize := SizeOf(TNotifyIconData);
    Wnd := Handle;
    uID := 1;
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallBackMessage := WM_NID;
    hIcon := Application.Icon.Handle;
    szTip := '托盘程序';
  end;
  Shell_NotifyIcon(NIM_ADD, @NotifyIcon); // 在托盘区显示图标
end;end.问题如下:        1、“提醒事件”窗口在动态建立后,会在桌面和任务栏托盘区域都显示出来。怎样将其做成动态建立后,不显示出窗体,直接放入托盘区域?
        
        2、显示到任务栏托盘区域后,图标不闪烁。怎样实现闪烁?就象QQ消息弹窗那样。        3、Const WM_NID = WM_User + 1;   这一句中,有的例子在WM_User后+1,有的例子在WM_User后+1000。这个1 和 1000 有什么区别?为什么要+?不+行不行?        4、我从网上查了下IsIconIc,网上说这个函数用于判断窗口是否最小化。最小化,则返回“非0”,未最小化,则返回“0”。            那么IF IsIconIc(Application.Handle) Then  判断后,结果是“最小化”还是“正常显示”?
  
        5、SetForegroundWindow(Form2.Handle)     这一句是“激活Form2”吧?        6、Application.BringToFront                               这一句是将窗口“置顶”吗?        7、PostMessage(Form2.Handle,WM_NULL,0,0);      这一句是什么意思,不明白,盼解答。
    
        8、为什么没有调用WMNID就能够将Form2放在任务栏托盘区域上。       本人分不多,不能给高分,还望各位大虾别嫌分少,能够不吝赐教,解我疑惑!!        

解决方案 »

  1.   

    图标闪烁,应该是两个图标交换,即一个空图标,然后一个实际图标,两者切换就可以实现动画效果了,另外这个是有现成的控件的,D2007之后,Delphi自带叫TrayIcon,之前有第三方的,貌似也是TrayIcon这种名字吧!
      

  2.   

    至于图标闪烁的问题,我有2种实现方案:
           1、2个不同的图标,使用IF语句后,闪烁频率和QQ弹窗的差不多,但缺点是2个图标不同。并不是其中1个图标是空,也是有图案的。       2、2个相同的图标,增加一个NotifyIcon,然后通过时间计算来实现闪烁。已经实现闪烁,但缺点是闪烁频率很慢,达不到QQ弹窗那种效果。    请问:如何做一个空的图标?通过什么软件?谁能提供给我一个空图标?另外,任务栏中图标应该是32位像素的图标,而不是16位像素的吧?因为16像素的好像比任务栏中其它的图标小。
      

  3.   

    使用TrayBarIconu单元(TrayIcon),做成一个托盘程序。
      

  4.   

    TRzTrayIcon   加上这个就可以了,很简单,