在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;
我怀疑该错误是在位图画布上的绘图中?
答案 0 :(得分: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;