gpt4 book ai didi

delphi - 如何在运行时将 48x48 .ico 加载到图像列表中并保留透明度

转载 作者:行者123 更新时间:2023-12-04 04:41:25 32 4
gpt4 key购买 nike

我更喜欢在弹出菜单中显示 48x48 .ico。

如果 BkColor 设置为 clNone,图标看起来很难看。 ImageList_GetIcon 也有一些丑陋的边缘。

enter image description here

如果 BkColor 设置为 ClMenu,图标漂亮,但高亮时图标为灰色背景。

enter image description here

ImageList_LoadImage 仅适用于 .bmp,因此无法使用。

ImageList1.BkColor := clMenu;
if FileExists(filename) then
begin
//h := ImageList_LoadImage(0, PChar(filename), 48, 48, CLR_NONE, IMAGE_ICON, LR_LOADFROMFILE);
h := LoadImage(0, PChar(filename), IMAGE_ICON, 48, 48, LR_LOADFROMFILE);
end
else
begin
h := ImageList_GetIcon(ImageList1.Handle, 0, ILD_NORMAL);
end;
ImageList_AddIcon(ImageList1.Handle, h);
DeleteObject(h);

最佳答案

我现在找到了一些信息。

A) 要使用大于 32x32 的图标,我们必须使用 LoadImage 函数。

B) 为避免出现丑陋的黑边,请在运行时通过使用 ImageList_Create 函数使用 32 位 ImageList。

C) 为避免出现难看的白边,请使用资源中的 LoadIcon 函数而不是设计时 ImageList。

procedure TForm1.LoadICO;
var
i: Integer;
h: HIcon;
folder: string;
filename: string;
begin
folder := GetCurrentDir + '\icon\';

{To support alpha transparency, you need to create the ImageList and populate it at runtime}
ImageList1.Handle := ImageList_Create(48, 48, ILC_COLOR32 or ILC_MASK, 0, ImageList1.AllocBy);

/////////////////////////////////////////////////////////////

filename := folder + ParamStr(i);

if FileExists(filename) then
begin
//h := ImageList_LoadImage(0, PChar(filename), 48, 48, CLR_NONE, IMAGE_ICON, LR_LOADFROMFILE);
{ImageList_LoadImage function work only IMAGE_BITMAP}
h := LoadImage(0, PChar(filename), IMAGE_ICON, 48, 48, LR_LOADFROMFILE);
{LoadImage function work with icon bigger than 32x32}
end
else
begin
//h := ImageList_GetIcon(ImageList3.Handle, 1, ILD_NORMAL);
{Ugly when get icon from designtime ImageList}
h := LoadIcon(hInstance, 'ICO1');
{Pretty when load icon from resources}
end;

/////////////////////////////////////////////////////////////

ImageList_AddIcon(ImageList1.Handle, h);
DeleteObject(h);
end;

D) 为了避免丑陋的黑边,还可以使用 comctl32.dll v6 来启用visualstyle平滑边缘。使用以下内容创建 xxx.exe.manifest 文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

E) 分配命令也会使白边变得丑陋。使用 For 循环和 ImageList_ReplaceIcon 函数更好。
//ImageList3.Assign(ImageList1);  {Assign command make ugly white edge}
h := ImageList_GetIcon(ImageList1.Handle, i, ILD_NORMAL);
ImageList_ReplaceIcon(ImageList3.Handle, i, h);
DeleteObject(h);

关于delphi - 如何在运行时将 48x48 .ico 加载到图像列表中并保留透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18831796/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com