我的问题是 - 是否可以将基于GDI的MFC View类包装在C#.Net托管代码中使用。
背景:
我目前正在开发一个在MFC中开发的遗留应用程序。它通过MFC的文档视图框架进行相同的基于GDI的绘图。这些都是简单的东西,比如画线和blit位图。但是,由于它是一个MFC应用程序,绘图代码是C ++ MFC,通过扩展CView类实现,并将绘图代码添加到扩展View类的OnDraw()成员函数。
现在,我想在应用程序之上放置一个漂亮的UI,所以我计划使用一个瘦的C ++ / CLI包装器,将我的应用程序的所有内容保留在MFC中,但只是使用WPF进行GUI - 如何向用户呈现控件。为了节省编码时间并避免编组,我想保留我的扩展MFC View类及其基于GDI的绘图代码。这可能吗?或者,如果我想将WPF用于GUI,我是否重写了绘图代码?
答案 0 :(得分:0)
是的,我们在申请中正是这样做的。我们决定创建一个DIB内存块,然后在绘制之前将其选择到DC中,并通过在主Grid控件中使用InteropBitmap将这些位放入WPF窗口。
您也可以使用WriteableBitmap和Lock + copy位,但同步与InteropBitmap略有不同。一个人进行双缓冲(InteropBitmap我相信)所以内存使用量增加了一倍但是WPF渲染线程没有机会将未填充/空图像发送到屏幕上。
我们需要挂钩CompositionTarget.Rendering通知并将其视为我们的WM_PAINT / OnShow触发器。
在WPF窗口创建过程中,我相信我们也会关注HwndSource的创建,并在此时将CView连接到创建的HWND。
我还要提到我们还有其中一条评论中提到的C ++ / CLI层。所以我在UI中用代码而不是XAML创建WPF控件。我们也可以将Window对象传递给C#进行操作,但C ++ / CLI使它成为一个更容易的端口IMO。