我的 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) 代码不起作用的主要内容,如果未能解决你的问题,请参考以下文章
无法在我的 Flash / HTML5 / Canvas 项目中播放音频
无法停止 requestAnimationFrame (Javascript/html5: canvas)
我的第一个项目:(解决问题)Vue中canvas无法绘制图片