2013-09-17 6 views

ответ

2

BlendColor свойство используется в Draw способе ImageList (или DrawOverlay).

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

будет использовать цвет, указанный в BlendColor когда является 'dsSelected' или 'dsFocus'.

Система, когда вы ее запрашиваете, использует системные цвета, такие как «выделить», «выбрано» ... Следовательно, ваш вызов функции 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;