求教托盘icon实现动画效果的问题,高人再入

bboonnee 2004-04-28 09:52:04
现在在做一个小客户端,需要实现托盘图标动画效果,象qq那样来信息后右下角托盘中的图标会闪烁,不知道用什么方法可以实现。笨办法是用一个定时器,然后间隔半秒改变icon, Shell_NotifyIcon(NIM_MODIFY,@NotifyIcon);可是那样似乎很耗费资源,而且怎么样将多个图标导入工程呢?
有那个高人做过,请指点一二!最好有代码实例
...全文
59 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjf1009 2004-04-30
  • 打赏
  • 举报
回复
mark
shuyi 2004-04-28
  • 打赏
  • 举报
回复
晕,有一个控件叫TrayIcon只要设置imagelist和一个参数CycleIcon:=true即可循环imagelist里面的图像,有现成控件干什么不用啊
bboonnee 2004-04-28
  • 打赏
  • 举报
回复
哦,呵呵,笨了,用一个真循环就ok了
bboonnee 2004-04-28
  • 打赏
  • 举报
回复
呵呵,事件发生时你怎么控制icon循环变换呢?还要间隔某一时间换图,不用定时器你怎么实现
我是老姚 2004-04-28
  • 打赏
  • 举报
回复
学习ING
楚人无衣 2004-04-28
  • 打赏
  • 举报
回复
写成象我上面那样一个过程序,只在事件发生时调用它才触发,更省资源呢,好于用定时器实现
bboonnee 2004-04-28
  • 打赏
  • 举报
回复
哈哈,搞定了,我贴出来大家共享吧
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if iconflag=1 then
begin
NID.hIcon:=Application.Icon.Handle;
Shell_NotifyIcon(NIM_MODIFY,@NID);
iconflag:=0;
end
else if iconflag=0 then
begin
NID.hIcon:=iconimage.Picture.Icon.Handle;
Shell_NotifyIcon(NIM_MODIFY,@NID);
iconflag:=1;

end;
不过还是用到了time,interval:1000,我1g的cpu多占用了%5,
楚人无衣 2004-04-28
  • 打赏
  • 举报
回复
www.xmflyfish.com/awind/adkiller.rar我刚刚做过,你参考一下,如QQ一样在托盘闪动;
我本来用多图标,后来又去掉了,给你个思路:就是编译其为res文件,添加到窗体中,这样图标就添进去了;ExtractIcon(HInstance, PChar(Application.ExeName), 1);这个是取编译在exe文件中的图标的,后面参数是图标索引,第一个是0;下面代码是换图标加声音提示的:
procedure TfrmAdKiller.ChgIcon;
var
sTips: string;
begin
sTips := '秋风网页广告拦截器 已拦截广告:' + IntToStr(iCount);
if cbSound.Checked then
PlaySound('sounde', HInstance, Snd_ASync or Snd_Memory or snd_Resource) ;
StrLCopy(NotifyIcon.szTip, PChar(sTips), Length(sTips));
NotifyIcon.hIcon := ExtractIcon(HInstance, PChar(Application.ExeName), 1);
Shell_NotifyIcon(NIM_MODIFY, @NotifyIcon);
Sleep(500);
NotifyIcon.hIcon := Application.Icon.Handle;
Shell_NotifyIcon(NIM_MODIFY, @NotifyIcon);
Sleep(500);
NotifyIcon.hIcon := ExtractIcon(HInstance, PChar(Application.ExeName), 1);
Shell_NotifyIcon(NIM_MODIFY, @NotifyIcon);
Sleep(500);
NotifyIcon.hIcon := Application.Icon.Handle;
Shell_NotifyIcon(NIM_MODIFY, @NotifyIcon);
end;
关于如何做res文件,去delphibbs上搜一下,很多
sandyboy 2004-04-28
  • 打赏
  • 举报
回复
呵呵。使用第三方控件好象是Raize吧它本身就有一个控件具有这个功能,而且很好用的!!!
bboonnee 2004-04-28
  • 打赏
  • 举报
回复
在线等啊
bboonnee 2004-04-28
  • 打赏
  • 举报
回复
哦,对了,在解释一下,高人再入不是召唤原来的高人,而是。。。
你是高人再进来,呵呵
bboonnee 2004-04-28
  • 打赏
  • 举报
回复
to weizi2000(秋风啊)
就是啊,被你也说对了,你用sleep()程序就没法子响应了,一旦那里执行,程序就跟当掉了一样,毕竟你是sleep的是主线程,而不是多线程运行。而timer控件则是多线程的简化,运行没有问题。
所以还是向楼下看到的推荐用timer,要不自己写多线程也行
qingenerp 2004-04-28
  • 打赏
  • 举报
回复
楼主的方法就可以啦,有不是老是让其循环换图片
支持一下,接点分!
sandyboy 2004-04-28
  • 打赏
  • 举报
回复
我觉得如果控件能够满足需求的话,还是尽量使用控件,毕竟是现成的。自己去编写会降低工作效率!个人观点:)
楚人无衣 2004-04-28
  • 打赏
  • 举报
回复
To yiboo(衣钵) :
呵呵,我上面代码写了三个Sleep(500);就是每隔半秒换一次啊!调用其时它就会在两秒时间内闪四次,当然你可以多写几个Sleep(500);重复,我这里只是提示作用;若你要求象QQ一样在用户响应之前一直闪,那用定时器也就对了;如你所说,也可用真循环,在其中用Application.ProcessMessages来截取停止消息,不过这样cpu可就不是5%而是100%了,:b
bboonnee 2004-04-28
  • 打赏
  • 举报
回复
晕,总用控件不但耗费资源还加大调试难度,能不用就不用

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧