Добавить прозрачное и растянутое изображение в список изображений в Delphi - PullRequest
2 голосов
/ 14 июля 2011

Согласно моему предыдущему вопросу с помощью Cosmin Prund, я нашел, как растянуть Image и добавить в ImageList:

procedure LoadDatasetImagesToImageList;
var 
  StretchedBMP: TBitmap;
  MS: TMemoryStream;
begin
  ImageList.Clear;
  ItemsDts.First;
  StretchedBMP := TBitmap.Create;
try

  // Prepare the stretched bmp's size
  StretchedBMP.Width := ImageList.Width;
  StretchedBMP.Height := ImageList.Height;

  // Prepare the memory stream
  MS := TMemoryStream.Create;
  try
    ImageBitmap:= TBitmap.Create;
    try
      while not ItemsDts.Eof do
      begin
        if not ItemsDtsPicture.IsNull then
        begin
          MS.Size := 0;
          ItemsDtsPicture.SaveToStream(MS);
          MS.Position := 0;
          ImageBitmap.LoadFromStream(MS);
          // Stretch the image
          StretchedBMP.Canvas.StretchDraw(Rect(0, 0, StretchedBmp.Width-1, StretchedBmp.Height-1), ImageBitmap);
          ImageList.Add(StretchedBmp, nil);
        end;
        ItemsDts.Next;
      end;
    finally 
      ImageBitmap.Free;
    end;
  finally 
    MS.Free;
  end;
finally
  StretchedBMP.Free;
end;

Теперь проблема в том, что вставленное изображение не прозрачно в ImageList.При отображении элементов в TListview изображения не прозрачны.Но при обычном добавлении изображений (без растяжения и использования переменной StretchedBMP) изображения становятся прозрачными.

PS: ссылка на предыдущий вопрос: Добавление растянутого изображения в ImageList в Delphi

1 Ответ

10 голосов
/ 14 июля 2011

Вы звоните ImageList.Add и передаете nil для маскирующего изображения. Вы можете либо вычислить маску, соответствующую вашему растянутому изображению, либо вместо этого вызвать ImageList.AddMasked, чтобы список изображений вычислил маску для вас на основе цвета, который вы называете «прозрачным» цветом. Вот что происходит, когда вы используете редактор компонентов списка изображений во время разработки.

...