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

迈克·K

有问题 我有一个带有画布的表单,我需要通过其句柄从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对象?

塞塔克·阿奎兹(Sertac Akyuz)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章