一个关于任务栏程序的问题,不能在任务栏上加图标,请指教(100分)

  • 主题发起人 主题发起人 ynfly
  • 开始时间 开始时间
Y

ynfly

Unregistered / Unconfirmed
GUEST, unregistred user!
我在网上找到一篇编写任务栏程序的文章,但我在应用时出了一点问题,就是不能在任务栏上
加图标,程序运行倒没有什么问题,而且在任务栏上有两个图标位置,鼠标在上面也能显示
"hello,world"的提示,我在程序的目录下有十个图标文件,名称分别是
Icon0.ico,Icon1.ico...Icon9.ico,图标文件是16X16大小,16色的,请各位大侠指教了,第一个
给我正确回答的将100分全部奉献
程序如下(FormCreate事件):
procedure TForm1.FormCreate(Sender: TObject);
begin
//加载Icon0..Icon9这10个图标资源,并且保存它们的句柄。
//图标Icon0..Icon9分别对应与0..9这9个数字。
hs[0]:=LoadIcon(hInstance, 'Icon0.ico');
hs[1]:=LoadIcon(hInstance, 'Icon1.ico');
hs[2]:=LoadIcon(hInstance, 'Icon2');
hs[3]:=LoadIcon(hInstance, 'Icon3');
hs[4]:=LoadIcon(hInstance, 'Icon4');
hs[5]:=LoadIcon(hInstance, 'Icon5');
hs[6]:=LoadIcon(hInstance, 'Icon6');
hs[7]:=LoadIcon(hInstance, 'Icon7');
hs[8]:=LoadIcon(hInstance, 'Icon8');
hs[9]:=LoadIcon(hInstance, 'Icon9');
// application.Icon.LoadFromFile('icon9.ico');
//填充NotifyIconData记录型变量nd0
nd0.cbSize := sizeof(NotifyIconData);
nd0.Wnd := form1.handle;
nd0.uID := 0;
nd0.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
nd0.uCallbackMessage := WM_TRAYNOTIFY;
nd0.hIcon := hs[0];
StrPLCopy(nd0.szTip, 'Hello, World!', 63);

//填充NotifyIconData记录型变量nd1
nd1.cbSize := sizeof(NotifyIconData);
nd1.Wnd := handle;
nd1.uID := 1;
nd1.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
nd1.uCallbackMessage := WM_TRAYNOTIFY;
nd1.hIcon := hs[0];
StrPLCopy(nd1.szTip, 'Simon Loves Daisy', 63);

//在任务栏状态区添加图标
Shell_NotifyIcon(NIM_ADD, @nd0);
Shell_NotifyIcon(NIM_ADD, @nd1);
end;
 
试试这个,

uses ShellApi

//增加小图标
procedure TForm1.FormCreate(Sender: TObject);
var
Nid : TNotifyIconData;
begin
FillChar(Nid, SizeOf(TNotifyIconData), 0);
Nid.cbSize := SizeOf(TNotifyIconData);
Nid.Wnd := Handle; //窗口句柄
Nid.uID := 1; //内部标识,可任意指定
Nid.hIcon := Application.Icon.Handle; //要加入的图标句柄
Nid.szTip := '图标示例程序'; //提示字符串
Nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; //指明哪些字段有效
if not Shell_NotifyIcon(NIM_ADD, @nid) then
Application.Terminate;
end;

//去除小图标
procedure TForm1.FormDestroy(Sender: TObject);
var
Nid : TNotifyIconData;
begin
FillChar(Nid, SizeOf(TNotifyIconData), 0);
Nid.cbSize := SizeOf(TNotifyIconData);
Nid.uID := 1; //内部标识,与加入小图标时的数一致
Nid.Wnd := Handle; //窗口句柄
Shell_NotifyIcon(NIM_DELETE, @nid ); //去掉小图标
end;
 
各位大哥,我只是加载不了图标而且系统也不会报错,而我也只是想知道为什么不能加载图标,
图标资源应该放在什么地方才能正确加载?
 
我完全清楚ynfly兄的意思,
我知道两中方法:
1,资源文件法
打开Delphi-ToolS-ImageEdit
New Res
然后新建Icon把你的不标画进去或粘贴进去然后命名
保存xxx.res文件(复制到你当前程序目录下,作为源文件的一部分)
在implemention下
{R xxx.res}
然后就可以按照你上叙方法调用,第一个参数不变,第二个参数为你为每个Icon定义的
名称!!!
2:图标文件法

调用Icon.LoadFromFile('xxx.ico');
不过在你程序发布的时候xxx.ico文件也要一起发行!

一般用第一种方法实现!
 
上面仁兄说的不错,你没有加载图表资源文件。
资源文件的建立还可以用下面方法,非常方便
1、建立一个文本文件,改名myRes.rc
在文件中输入:
Icon0 ICO Icon0.ico
Icon1 ICO Icon1.ico
......(雷同)
Icon9 ICO Icon9.ico
2、建立一批处理文件myres.bat
输入内容:
BRCC32 myRes.rc
3、运行myres.bat后,目录中将自动生成一文件myRes.RES
4、在你调用图标的文件中,在implemention下输入
{R myRes.res}
5、OK,可以了。
注意,所有建立的文件必须和图标文件在同一目录。
 
多人接受答案了。
 
后退
顶部