【问题标题】:How to Get TCanvas DC in Firemonkey?如何在 Firemonkey 中获取 TCanvas DC?
【发布时间】:2013-08-22 13:14:03
【问题描述】:

我需要什么

我需要获取 Firemonkey 组件的TCanvas 的 DC。我需要这个来使用无法通过 Firemonkey 访问的 Win API 绘图功能,主要是 100% 控制字体渲染。

显然,这是一个纯 Windows 应用程序,因此与 OSX 的任何兼容性都不是问题。

我做了什么

我设法获取了 TForm 的句柄并将其转换为 HWND,然后使用GetDC(FmxHandleToHWND(Handle)); 获取 DC

这是Character_PaintBox 控件的OnPaint 处理程序。

HWND hWND = FmxHandleToHWND(Handle);
HDC hDC = GetDC(hWND);
int x = PreviewBack_Rectangle->Position->X + Character_PaintBox->Position->X;
int y = PreviewBack_Rectangle->Position->Y + Character_PaintBox->Position->Y;

TextOut(hDC,x,y,L"Test",4);

ReleaseDC(hWND,hDC);

这是表单的 DC,我写的任何内容都会在下次更新时被覆盖。

这在 VCL 中是一项简单的任务,而在 Firemonkey 中不可能那么复杂,或者?

【问题讨论】:

  • 对 Firemonkey 没有任何经验,但也许将您的 GDI 绘制到内存位图中并在 firemonkey 中显示该位图会更好。

标签: winapi c++builder firemonkey gdi


【解决方案1】:

问题在于,使用 Firemonkey,表单只有一个设备上下文,而不是每个组件都有一个设备上下文。当一个组件需要重新绘制时,它会通过表单画布,但剪辑和坐标映射到组件位置。正如您已经发现的那样,在 Windows 中,您可以随时获取该上下文并在其上进行绘制,但随后您将与在绘制方法中发生的正常 firemonkey 绘制竞争。

您可以在表单上放置一个 TImage 并对其进行自定义绘图。当表单需要绘制时,Firemonkey 将继续重绘图像。

我知道您说过您不想要 MAC,但对于其他阅读本文的人来说,您无法在 OSX 上获取图形上下文并对其进行绘制,因为该上下文在绘制方法之外无效。所以图像方法将是唯一的方法。这大概解释了为什么 Firemonkey 使用单一上下文。

【讨论】:

  • 感谢您的解释!这些行为现在变得更有意义了。有时间我会试试看的。
猜你喜欢
  • 2014-08-22
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
相关资源
最近更新 更多