【发布时间】:2012-11-16 09:17:21
【问题描述】:
我最近在 Delphi 2007 中发现了 TTrayIcon 组件。使用的代码非常简单。
procedure TForm1.FormCreate(Sender: TObject);
begin
AppTrayIcon := TTrayIcon.Create(nil);
AppTrayIcon.OnDblClick := OnAppTrayIconDblClick;
Application.OnMinimize := OnApplicationMinimize;
Application.OnRestore := OnApplicationRestore;
end;
procedure TForm1.OnApplicationRestore(Sender: TObject);
begin
AppTrayIcon.Visible := False;
ShowWindow(Application.Handle, SW_SHOW);
Application.BringToFront;
end;
procedure TForm1.OnApplicationMinimize(Sender: TObject);
begin
AppTrayIcon.Visible := True;
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.OnAppTrayIconDblClick(Sender: TObject);
begin
Application.Restore;
end;
由于没有分配图标,Delphi 使用 Application.Icon,也就是那个图标:http://artbyloveland.com/icon.ico 这个图标包括以下尺寸:64x64、48x48、32x32、24x24 和 16x16。
现在,在我的 Windows Vista 上,一切正常。
在像 Windows Server 2003 这样的非主题 Windows 上,结果完全搞砸了:
编辑: 起初,我以为是因为 alpha 通道。所以我尝试在不使用 alpha 通道的情况下制作 ico 文件的版本。我还按照 Ken 的建议尝试了 GreenFish 图标编辑器;我选择了每种颜色深度和每种可用尺寸。在这两种情况下,最终结果都更好。但是,ico文件中根本不存在黑色笔划。
【问题讨论】:
-
你需要一个小图标的HICON。调用 GetSystemMetrics 以了解它有多大。例如,如果值为 20,那么您的尺寸不正确。更可能的是,该组件使用的是普通的旧 LoadIcon,并且您有一个重新采样的 32px 图标。
-
好吧,即使它是 20,也可能是另一台计算机安装的其他东西,对吧?无论如何,我在 Windows 2003 服务器上的 SM_CXSMICON 得到 16。我可以通过应用 Ken 的建议来部分修复该错误;但是,在ico文件中仍然存在最初不存在的黑色笔划。
-
我总是打电话给
Shell_NotifyIcon并传入我用LoadImage制作的HICON。 VCL 对图标的处理是没有希望的。除了让这个组件使用Application.Icon之外,我没有看到任何证据表明你正在做任何事情,这注定要失败。 -
使用 Shell_NotifyIcon 并通过 LoadImage 加载图标就可以了!最终结果是完美的。我如何接受你的回答?
-
我会给你写一个你可以接受的答案。