有问题 我有一个带有画布的表单,我需要通过其句柄从dll访问此画布。我这样做是这样的:
从dll
canvas := TCanvas.Create;
try
canvas.Handle := handle;
// do some painting on this canvas
finally
canvas.free;
end;
它运作良好,我从dll中画出我需要的东西。但这招有副作用。从dll绘制后,窗体丢失字体设置(顺便说一句,从dll绘制时,我没有使用字体,只有少数矩形),并且从主窗体在同一画布上绘制时,即使我直接进行canvas.font.size:= .. 。; canvas.font.name:= ...; 在canvas.TextOut之前,字体不变。线条,填充和其他绘画都可以。但是字体会损坏(有时不会,但多数情况下)。
有没有一种方法可以重置/重新初始化窗体的TCanvas对象?
Canvas没有任何重置功能,但是您可以要求api保存画布的设备上下文状态,并在绘制后将其还原。
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)的答案说明了您如何失去设备上下文的状态。为什么它并不总是发生,应该取决于我相信的时机。如果表单在其画布使用其字体时进入了一个新的绘制周期,那么一切都应该很好,因为它是在新获取和设置的设备上下文上运行的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句