Мой код с 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;