gpt4 book ai didi

Delphi TCanvas 对象在使用 dll 后损坏,如何恢复?

转载 作者:行者123 更新时间:2023-12-03 15:44:48 25 4
gpt4 key购买 nike

遇到一些问题。我有一个带有 Canvas 的表单,我需要通过其句柄从 dll 访问该 Canvas 。我这样做是这样的:

来自dll

canvas := TCanvas.Create;
try
canvas.Handle := handle;
// do some painting on this canvas
finally
canvas.free;
end;

效果很好,我从 dll 中绘制了我需要的内容。但这个技巧有副作用。从 dll 绘制后,窗体丢失字体设置(顺便说一句,从 dll 绘制时我没有使用字体,只使用几个矩形),并且当我从主窗体在同一 Canvas 上绘制时,即使我直接这样做 canvas.font.size := .. .; canvas.font.name := ...;在canvas.TextOut之前,字体不会改变。线条、填充等绘画都可以。但字体会被损坏(有时不会,但大多数情况下)。

有没有办法重置/重新初始化表单的 TCanvas 对象?

最佳答案

Canvas 没有任何重置功能,但您可以要求 api 保存 Canvas 的设备上下文状态,并在绘制后恢复它。

var
SavedDC: Integer;

...
SavedDC := SaveDC(handle);
try
canvas := TCanvas.Create;
try
canvas.Handle := handle;
// do some painting on this canvas
finally
canvas.free;
end;
finally
RestoreDC(handle, SavedDC);
end;


Remy's answer解释了如何丢失设备上下文的状态。我认为为什么它并不总是发生应该取决于时机。如果表单在其 Canvas 使用其字体时已进入新的绘制周期,则一切都应该很好,因为它在新获取和设置的设备上下文上运行。

关于Delphi TCanvas 对象在使用 dll 后损坏,如何恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36321490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com