我想在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放在任务栏托盘区域上。 本人分不多,不能给高分,还望各位大虾别嫌分少,能够不吝赐教,解我疑惑!!
当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、2个不同的图标,使用IF语句后,闪烁频率和QQ弹窗的差不多,但缺点是2个图标不同。并不是其中1个图标是空,也是有图案的。 2、2个相同的图标,增加一个NotifyIcon,然后通过时间计算来实现闪烁。已经实现闪烁,但缺点是闪烁频率很慢,达不到QQ弹窗那种效果。 请问:如何做一个空的图标?通过什么软件?谁能提供给我一个空图标?另外,任务栏中图标应该是32位像素的图标,而不是16位像素的吧?因为16像素的好像比任务栏中其它的图标小。