我需要获取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中不会那么复杂,或者?
答案 0 :(得分:3)
问题在于,使用Firemonkey时,表单只有一个设备上下文,而每个组件只有一个。当需要重新绘制组件时,它会传递给窗体画布,但剪切和坐标映射到组件位置。正如您已经发现的那样,在Windows中,您可以随时获取该上下文并在其上绘制,但您将与绘制方法中正常的firemonkey绘画竞争。
您可以在表单上放置一个TImage并自定义绘图。当表单需要绘图时,Firemonkey会不断重绘图像。
我知道你说你不想要MAC但是对于读这个的其他人来说,你无法在OSX上获得图形上下文并绘制它,因为上下文在paint方法之外是无效的。所以图像方法将是唯一的方法。这可能解释了为什么Firemonkey适用于单一环境。