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

Posted

技术标签:

【中文标题】我的 TGraphic.Draw(Canvas, Rect) 代码不起作用【英文标题】:My code with TGraphic.Draw(Canvas, Rect) does not work 【发布时间】:2016-01-04 19:50:37 【问题描述】:

在 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;

我怀疑问题出在位图画布上的绘图中?

【问题讨论】:

我也想知道 ***.com/questions/34139196/saveto-stringhelper 和 ***.com/questions/34559867/… 和 ***.com/questions/29077977/… 和 ***.com/questions/24288185/tbutton-deficiencies 发生了什么我认为这些问题,可能还有更多问题,可以有效地解决 cmets 没有朝着富有成效的方向发展,而是关于问题的适用性的元讨论,而不是主题本身。一旦侮辱开始被抛出并且旗帜开始积累,它们就会被移除。如果你想进一步讨论这个问题,你可以在Meta.SO询问。 @DavidHeffernan 所以标记你认为需要删除的内容,我们会看看。使用标志,我们可以轻松检查记录,使用 cmets 我们没有。 @GeorgeStocker 我认为不需要删除任何东西,我只是认为这些问题已经得到解答 【参考方案1】:

此处绘制的正确方法是在目标位图的画布上调用Draw,传递源图形。您调用的方法在TGraphic 中声明为protected,这表明您不打算从消费者代码中调用它。

所以不是

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;

【讨论】:

显然Draw 方法已公开以允许绘图。为什么你会认为这是一个错误? 它在TBitmap 中不公开,并且该类工作正常。这驳斥了您所说的“显而易见”。它受到保护,因为消费者不应该调用它。它只能从派生类中调用。所以我认为它公开是一个错误。 documentation 说,TGraphic 的后代应该用特定的渲染实现覆盖这个函数。 你看过WebPicture的出处吗?如果没有,你为什么认为它没有特定的渲染实现? 嗯,我希望它确实有。但它不需要公开。因为它是从类内部或其关联类之一调用的。而 TGraphic.Draw 是抽象的。因此,压倒一切并保持保护是常态。我引用的重点是,这些文档是为派生者而不是消费者的利益而编写的。这是一个被覆盖而不被调用的方法。 @Silver 和@user 你们都错了。如果引发异常,则根本不返回任何值。因为异常。

以上是关于我的 TGraphic.Draw(Canvas, Rect) 代码不起作用的主要内容,如果未能解决你的问题,请参考以下文章

canvas指令大全

无法在我的 Flash / HTML5 / Canvas 项目中播放音频

无法停止 requestAnimationFrame (Javascript/html5: canvas)

我的第一个项目:(解决问题)Vue中canvas无法绘制图片

我的画布,动静皆宜 | My Canvas in 2018 CUUNION

Javascript Canvas +对象/功能