如何解决无法在运行时添加到虚拟映像列表的菜单上显示图标
我无法在运行时添加的菜单项上显示图标。 我将菜单项添加到主菜单,其图像属性链接到TVirtualImageList,后者链接到TImageCollection。所有固定图像都保存在“虚拟图像”列表中,在运行时,我添加了其他菜单项,将每个图像作为图标添加到“虚拟图像列表”中。主菜单有一个虚拟菜单项,附加菜单附加到该菜单项。
function LoadIconFromFile(FileName: String; Var Icon: TIcon): Integer; overload;
var SHInfo: TSHFileInfo;
begin
Result := -1;
if not FileExists(FileName) then exit;
SHGetFileInfo(PChar(FileName),SHInfo,SizeOf(SHInfo),SHGFI_ICON OR SHIL_LARGE);
Icon.Handle := SHInfo.hIcon;
Icon.Transparent := true;
result := $1000;
end;
TmpIcon := TIcon.Create;
LoadIconFromFile(FileName,TmpIcon);
MenuItem.ImageIndex := vilMenues.AddIcon(TmpIcon);
image1.Picture.Graphic := TmpIcon;
TmpIcon.Free;
MainMenu.BaseMenuItem.Add(MenuItem);
为了确保我实际上正确地拾取了图标,我还将其显示在TImage中。添加了附加菜单项,并且图标出现在TImage控件中,但从未出现在菜单上。我知道图像会被添加到图像列表中,因为图像计数会增加。我尝试过在更新和重新附加之后从主菜单中分离图像列表,但这没有什么区别。我开始怀疑TVirtualImageList是否能够处理图像的混合来源?
有人可以建议我该怎么做才能解决这个问题?
解决方法
TImageCollection
不支持图标。
使用AddIcon
方法时,TCustomImageList.AddIcon
会调用覆盖的方法TVirtualImageList.DoChange
,该方法将更新图像集中的整个虚拟图像列表。
因此,如果您在虚拟图像列表中有3张图像并调用AddIcon
,它将返回3的新图像索引,并且列表中现在有4张图像。但是然后重新创建了虚拟映像列表,并且其Count
回到了3。
我可以将其与以下代码一起使用:
TmpIcon := TIcon.Create;
Strm := TMemoryStream.Create;
LoadIconFromFile(FileName,TmpIcon);// get icon from file
tmpIcon.SaveToStream(Strm);
s := 'X'+IntToStr(idx); // Add a name for new item
ImageCollection1.Add(s,strm); // Add to collection
idy:= ImageCollection1.Count -1; // Get the index for it
vilMenues.Add(s,idy); // Add it to virtual image list
MenuItem.ImageIndex := vilMenues.Count -1;
Strm.Free;
TmpIcon.Free;
有点笨拙,我觉得必须有更好的方法...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。