delphi - 如何从系统ImageList中绘制图像的缩放版本?

标签 delphi scale timagelist

我创建并初始化TImageList...

ImageList:=TImageList.Create(self);
ImageList.ShareImages:=true;

我获取小图标 (16x16) 的系统 ImageList 句柄...

ImageList.Handle:=SHGetFileInfo('',0,FileInfo,SizeOf(FileInfo),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

现在我想在控制 Canvas 上绘制缩放为 50x50 像素的图标。我该怎么做?

最佳答案

放大小图标从来都不是好主意。 16X16 图标太小,无法按原样以任何其他方式使用。

首先,您可以使用以下命令获取更大的 shell 图像

ImageList.Handle:=SHGetFileInfo('',0,FileInfo,SizeOf(FileInfo),SHGFI_SYSICONINDEX or SHGFI_ICON);

这些图像通常为 32x32 像素,但为了安全起见(如果 Windows 在高 DPI 模式下运行),您可以从系统获取正确的尺寸

uses
  Winapi.Windows;

var
  IconWidth, IconHeight: integer;

  IconWidth := GetSystemMetrics(SM_CXICON);
  IconHeight := GetSystemMetrics(SM_CYICON);

您还可以使用 SHGetImageList 获取更大的 shell 图像 http://msdn.microsoft.com/en-us/library/windows/desktop/bb762185%28v=vs.85%29.aspx

要从 ImageList 中检索图标(如果 ImageList 包含图标,并且在您的情况下确实如此),您可以使用:

ImageList.GetIcon(Index: Integer; Image: TIcon);

要在保留透明度的同时缩放图标到自定义尺寸,您可以使用以下代码:

procedure StretchDrawIcon(Canvas: TCanvas; Dest: TRect; Icon: TIcon);
begin
  DrawIconEx(Canvas.Handle, Dest.Left, Dest.Top, Icon.Handle, Dest.Right - Dest.Left, Dest.Bottom - Dest.Top, 0, 0, DI_NORMAL);
end;

关于delphi - 如何从系统ImageList中绘制图像的缩放版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27135438/

相关文章:

Delphi,在设计时,当使用 nil 所有者创建时 ComponentState、ControlState 的状态是什么?

delphi - 延迟检测用 TThread.ForceQueue() 调用的已释放对象

html - 如何在 CSS 中正确定位和缩放这些元素?

delphi - 在运行时查看 TImagelist 的内容

delphi - MakeScreenshot 泄露?

rest - 在 Delphi 中使用来自 Indy 的 GitHub API

css - Div 在悬停时随比例移动

ios - 在swift3中将图像缩放到更小的尺寸

delphi - 在高 DPI 模式下使用 PNG 图标缩放 TImageList

delphi - TSpeedbutton 中的图像与 TImageList