我在Windows 10上运行,但是使用Delphi 7(是的,我知道它已经很老了)。
我想在Windows中使用系统图标,并通过定义名为TImageList
的{{1}}来解决此问题,我将其初始化如下:
SystemIcons
我将var
fileInfo: TSHFileInfo;
begin
SystemIcons.Handle := ShGetFileInfo('', 0, fileInfo, SizeOf(fileInfo),
SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX);
...
个属性静态设置为SystemIcons
组件,其宽度和高度设置为16。
在其他地方,我希望在给定有效shell对象的图像索引的情况下从此图像列表中检索图标。因为这些是"小系统图标",我希望它们是16x16。调用TImageList
的结果会产生16.奇怪的是,维度取决于我是将它们检索为位图还是图标。
GetSystemMetrics(SM_CYSMICON)
...
var
icon: TIcon;
bm: TBitmap;
begin
...
icon := TIcon.Create;
SystemIcons.GetIcon(imgIndex, icon);
bm := TBitmap.Create;
SystemIcons.GetBitmap(imgIndex, bm);
是正确的,两种情况都是一样的。正如预期的那样,在每种情况下检索的图像都是相同的。位图(imgIndex
和bm.Width
)的尺寸也符合预期:16x16。但是,图标(bm.Height
和icon.Width
)的尺寸不是。它们是32x32。
当我在画布上绘制图标时,它显示为16x16。因此,只有icon.Height
和Height
值显示不正确。很奇怪。
为什么这些不同?
答案 0 :(得分:0)
图像实际上可能是32x32开始。
在内部,TImageList.GetIcon()
只需使用HICON
直接从基础Win32 ImageList API检索所选图像的ImageList_GetIcon()
,并将其分配给TIcon.Handle
属性。< / p>
另一方面,
TImageList.GetBitmap()
有点不同。它将TBitmap
的尺寸调整为TImageList
(16x16)的尺寸,然后拉伸使用TBitmap.Canvas
将所选图像绘制到TImageList.Draw()
上,ImageList_DrawEx()
依次使用list<>
}}。