如何在Firemonkey中获取TCanvas DC?

时间:2013-08-20 13:05:48

标签: winapi c++builder firemonkey device-context

我需要什么

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

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

我做了什么

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

这是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);

这是Form的DC,我写的任何东西都会在下次更新时被覆盖。

这在VCL中是一个简单的任务,它在Firemonkey中不会那么复杂,或者?

1 个答案:

答案 0 :(得分:3)

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

您可以在表单上放置一个TImage并自定义绘图。当表单需要绘图时,Firemonkey会不断重绘图像。

我知道你说你不想要MAC但是对于读这个的其他人来说,你无法在OSX上获得图形上下文并绘制它,因为上下文在paint方法之外是无效的。所以图像方法将是唯一的方法。这可能解释了为什么Firemonkey适用于单一环境。