所有方法都与系统高亮蓝色混合。
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);
答案 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;