我的代码与TGraphic.Draw(Canvas,Rect)不起作用

时间:2016-01-04 19:50:38

标签: delphi draw delphi-10-seattle tcanvas

在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 个答案:

答案 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;