加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:14:33 所属栏目:大数据 来源:网络整理
导读:我想将标准窗口信息(和警告和错误)图标绘制到pagecontrol的选项卡的索引.但是,如果窗口背景颜色不是白色,则结果看起来很糟糕. program Project111;uses Vcl.Forms,Vcl.Controls,Vcl.Graphics,Winapi.Windows,Vcl.ComCtrls,Vcl.ImgList;{$R *.res}var mainFor
我想将标准窗口信息(和警告和错误)图标绘制到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,{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.

这是一个截图:

正如你可以看到白色边框模糊,我想这是因为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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读