delphi – 如何将标准窗口信息图标很好地绘制到pagecontrol选项卡的索引

我想将标准窗口信息(和警告和错误)图标绘制到pagecontrol的选项卡的索引.但是,如果窗口背景颜色不是白色,则结果看起来很糟糕.

program Project111;

uses
  Vcl.Forms,
  Vcl.Controls,
  Vcl.Graphics,
  Winapi.Windows,
  Vcl.ComCtrls,
  Vcl.ImgList;

{$R *.res}

var
  mainForm: TForm;
  imageList: TImageList;
  icon: TIcon;
  pageControl: TPageControl;
  tabSheet: TTabSheet;
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  Application.CreateForm(TForm, mainForm);

  imageList := TImageList.Create(mainForm);
  imageList.ColorDepth := cd32bit;
  icon := TIcon.Create;
  try
    icon.Handle := LoadImage( 0, IDI_INFORMATION, IMAGE_ICON, 16, 16, {LR_DEFAULTSIZE or} LR_SHARED );
    imageList.AddIcon(icon);
  finally
    icon.Free;
  end;

  pageControl := TPageControl.Create(mainForm);
  pageControl.Parent := mainForm;
  pageControl.Images := imageList;

  tabSheet := TTabSheet.Create(mainForm);
  tabSheet.Parent := pageControl;
  tabSheet.PageControl := pageControl;
  tabSheet.ImageIndex := 0;

  Application.Run;
end.

这是一个截图:
enter image description here

正如你可以看到白色边框模糊,我想这是因为TImageList缺乏正确的alpha透明度,但我不知道如何解决这个问题.

解决方案不必使用TImageList,我很乐意使用任何其他方法.请注意,还会有字幕,并且并非所有索引都有图标,并且随着上下文的更改,图标可能会更改/添加/删除.

我正在使用Delphi XE-2,如果有帮助,我也有DevExpress组件.

最佳答案
正如@Sertac所说,你看到的是将windows shell图标的大小从32×32调整为16×16的效果,从Windows Vista开始,你可以使用SHGetStockIconInfo功能.
传递SHGSI_SMALLICON标志以检索SM_CXSMICON和SM_CYSMICON指定的图标的小版本.

SM_CXSMICON和SM_CYSMICON的值取决于当前的DPI设置.对于DPI 96是16×16.

样品

  LIcon := TIcon.Create;
  try
    LIcon.Handle := 0;
    if TOSVersion.Check(6, 0) then
    begin
      ZeroMemory(@LSHStockIconInfo, SizeOf(LSHStockIconInfo));
      LSHStockIconInfo.cbSize := sizeof(LSHStockIconInfo);
      if SHGetStockIconInfo(SIID_INFO, SHGSI_ICON or SHGSI_SMALLICON, LSHStockIconInfo) = S_OK then
      begin
        LIcon.Handle := LSHStockIconInfo.hIcon;
        imageList.AddIcon(LIcon);
      end;
    end;
  finally
    LIcon.Free;
  end;

转载注明原文:delphi – 如何将标准窗口信息图标很好地绘制到pagecontrol选项卡的索引 - 代码日志