0

所有方法都与系统突出显示蓝色混合。

ImageList1.BlendColor := clGray;
ImageList1.DrawingStyle := dsSelected;

ImageList1.GetIcon(0, icon);    
ImageList1.GetIcon(0, icon, dsSelected, itImage);    
icon.handle := ImageList_GetIcon(ImageList1.Handle, 0, ILD_SELECTED); 
4

1 回答 1

2

BlendColor属性由DrawImageList(或DrawOverlay)的方法使用。

ImageList1.Draw(Canvas, 0, 0, 0);

将使用您在“dsSelected”或“dsFocus”中指定的BlendColor颜色DrawingStyle

当您请求系统这样做时,系统会使用系统颜色,例如“突出显示”、“选定”……因此,您对 winapi 函数的调用将如此。


由于没有从 ImageList 请求混合图标的内置方法,您可以请求它在位图上为您进行混合,然后将其转换为图标。例如,您可以在此处找到使用临时图像列表的示例,或在此处找到。或者,您可以获取列表以绘制图像及其蒙版以将它们组合成一个图标,可能如下所示:

var
  Icon: TIcon;
  Bmp: TBitmap;
  MaskBmp: TBitmap;
  IconInfo: TIconInfo;
begin
  Icon := TIcon.Create;

  Bmp := TBitmap.Create;
  try
    Bmp.PixelFormat := pf32bit;
    Bmp.Canvas.Brush.Color := clBlack;
    Bmp.Width := ImageList1.Width;
    Bmp.Height := ImageList1.Height;

    MaskBmp := TBitmap.Create;
    try
      MaskBmp.PixelFormat := pf32bit;
      MaskBmp.Canvas.Brush.Color := clWhite;
      MaskBmp.Width := ImageList1.Width;
      MaskBmp.Height := ImageList1.Height;

      ImageList1.BlendColor := clRed;
      ImageList1.Draw(Bmp.Canvas, 0, 0, 0, dsSelected, itImage);
      ImageList1.Draw(MaskBmp.Canvas, 0, 0, 0, dsNormal, itMask);

      IconInfo.fIcon := True;
      IconInfo.hbmMask := MaskBmp.Handle;
      IconInfo.hbmColor := Bmp.Handle;

      Icon.Handle := CreateIconIndirect(IconInfo);

    finally
      MaskBmp.Free;
    end;
  finally
    Bmp.Free;
  end;
end;
于 2013-09-17T13:03:01.280 回答