Winapi 如何在Firemonkey中获取TCanvas DC? 我需要什么

Winapi 如何在Firemonkey中获取TCanvas DC? 我需要什么,winapi,c++builder,firemonkey,gdi,Winapi,C++builder,Firemonkey,Gdi,我需要获取Firemonkey组件的tcavas的DC。我需要这个来使用Firemonkey无法访问的WinAPI绘图函数,主要是100%控制字体渲染 显然,这是一个纯Windows应用程序,因此与OSX的任何兼容性都不是问题 我所做的 我设法获得了TForm的句柄并将其转换为HWND,然后使用GetDC(FmxHandleToHWND(handle))获取DC 这是Character\u PaintBox控件的OnPaint处理程序 HWND hWND = FmxHandleToHWND(Ha

我需要获取Firemonkey组件的
tcavas
的DC。我需要这个来使用Firemonkey无法访问的WinAPI绘图函数,主要是100%控制字体渲染

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

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

这是
Character\u 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中,表单只有一个设备上下文,而不是每个组件都有一个。当一个组件需要重新绘制时,它会通过表单画布,但裁剪和坐标会映射到组件位置。正如您已经发现的,在Windows中,您可以随时获取该上下文并在其上进行绘制,但您将与在绘制方法中发生的常规firemonkey绘制进行竞争

您可以在表单上添加一个时间段,然后根据该时间段进行自定义绘图。当表单需要绘制时,Firemonkey将继续重新绘制图像


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

我没有Firemonkey的任何经验,但也许将GDI绘制到内存位图中并在Firemonkey中显示该位图会更好。谢谢您的解释!这些行为现在变得更有意义了。当我有时间的时候,我会试试看。