Delphi7:如何从ImageList获取混合颜色为灰色的图标

时间:2013-09-17 11:48:31

标签: delphi delphi-7 grayscale notifyicon imagelist

所有方法都与系统高亮蓝色混合。

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); 

1 个答案:

答案 0 :(得分:2)

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

ImageList1.Draw(Canvas, 0, 0, 0);
BlendColor为'dsSelected'或'dsFocus'时,

将使用您在DrawingStyle中指定的颜色。

当您要求系统执行此操作时,系统会使用系统颜色,例如“突出显示”,“已选择”...因此,您对winapi功能的调用将会因此而产生。

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

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;