3

我需要的

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

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

我做了什么

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

这是控件的OnPaint处理程序Character_PaintBox

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 中它不可能那么复杂,或者?

4

1 回答 1

3

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

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

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

于 2014-01-03T14:58:23.230 回答