Мой код с TGraphic.Draw(Canvas, Rect) не работает

В Delphi 10 Seattle мне нужно вставить изображение в ImageList. Изображение находится в потомке TGraphicControl (см. Исходный код ниже). Кажется, вставка работает. Тем не менее, я получаю только белый прямоугольник в ImageList:

function InsertCloudImageIntoImageList(AdvCloudImage1: TAdvCloudImage): Integer;
// TAdvCloudImage = class(TGraphicControl)
// WebPicture is TCloudPicture = class(TGraphic)
var
  TempBitmap: TBitmap;
  R: TRect;
begin
  Result := 0;
  TempBitmap := TBitmap.Create;
  try
    TempBitmap.SetSize(16, 16);
    R.Width  := 16;
    R.Height := 16;
    R.Top := 0;
    R.Left := 0;

    AdvCloudImage1.WebPicture.Draw(TempBitmap.Canvas, R);
    Result := Form1.ImageList1.Add(TempBitmap, nil);
  finally
    TempBitmap.Free;
  end;
end;

Я подозреваю, что ошибка в рисунке на растровом холсте?

1 ответ

Решение

Правильный способ рисовать здесь это позвонить Draw на холсте точечного рисунка, передавая исходную графику. Метод, который вы вызываете, объявлен protected в TGraphic что означает, что вы не должны вызывать его из кода потребителя.

Так что вместо

AdvCloudImage1.WebPicture.Draw(TempBitmap.Canvas, R);

Вы должны использовать

TempBitmap.Canvas.Draw(0, 0, AdvCloudImage1.WebPicture);

Это значительно упрощает функцию, так как вам больше не нужно TRect переменная. Кроме того, нет смысла присваивать Result больше чем единожды. Вся функция может быть:

function InsertCloudImageIntoImageList(AdvCloudImage1: TAdvCloudImage): Integer;
var
  TempBitmap: TBitmap;
begin
  TempBitmap := TBitmap.Create;
  try
    TempBitmap.SetSize(16, 16);
    TempBitmap.Canvas.Draw(0, 0, AdvCloudImage1.WebPicture);
    Result := Form1.ImageList1.Add(TempBitmap, nil);
  finally
    TempBitmap.Free;
  end;
end;
Другие вопросы по тегам