包装基于GDI的MFC视图以在C.Net托管代码中使用

包装基于GDI的MFC视图以在C.Net托管代码中使用,.net,wpf,mfc,c++-cli,interop,.net,Wpf,Mfc,C++ Cli,Interop,我的问题是-是否可以包装一个基于GDI的MFC视图类以在C.Net托管代码中使用 背景: 我目前正在开发一个用MFC开发的遗留应用程序。它通过MFC的文档视图框架完成相同的基于GDI的绘图。这些都是简单的东西,比如画线和位图。然而,由于它是一个MFC应用程序,所以绘制代码是C++ MFC,通过扩展CView类来实现,并将绘图代码添加到扩展视图类的OnDead成员函数。 现在,我想在应用程序的顶部添加一个漂亮的UI,所以我计划使用一个精简的C++/CLI包装器,将我的应用程序的所有细节都保留在MF

我的问题是-是否可以包装一个基于GDI的MFC视图类以在C.Net托管代码中使用

背景:

我目前正在开发一个用MFC开发的遗留应用程序。它通过MFC的文档视图框架完成相同的基于GDI的绘图。这些都是简单的东西,比如画线和位图。然而,由于它是一个MFC应用程序,所以绘制代码是C++ MFC,通过扩展CView类来实现,并将绘图代码添加到扩展视图类的OnDead成员函数。
现在,我想在应用程序的顶部添加一个漂亮的UI,所以我计划使用一个精简的C++/CLI包装器,将我的应用程序的所有细节都保留在MFC中,而只是简单地将WPF用于GUI—如何向用户显示控件。为了节省编码时间并避免编组,我希望保留扩展的MFC视图类及其基于GDI的绘图代码。这可能吗?或者,如果我想使用WPF for GUI,是否需要重写绘图代码?

是的,我们在应用程序中正是这样做的。我们决定创建一个DIB内存块并将其选择到DC中,然后通过在主网格控件中使用InteropBitmap将位绘制并获取到WPF窗口中

您也可以使用WriteableBitmap并将位锁定+复制到其中,但同步与InteropBitmap略有不同。一个是双缓冲InteropBitmap,我相信这样内存使用量就翻了一倍,但是WPF渲染线程不可能有一个黑色的flash将一个未填充/空的图像发送到屏幕上

我们需要钩住CompositionTarget.Rendering通知,并将其视为WM_PAINT/OnShow触发器

在创建WPF窗口的过程中,我相信我们也会关注HwndSource的创建,并在此时将CView连接到所创建的HWND


我还将提到,我们还有一个C++/CLI层,如其中一条评论中所述。因此,我在UI中用代码而不是XAML创建WPF控件。我们也可以将窗口对象传递给C进行操作,但C++/CLI使其更容易操作。

@Admins,问题是否已发布且可见?它收到的视图数量惊人地少。您是否可以选择将MFC视图包装到控件(MFC或ATL)中?我的偏好是ATL…虽然我将ATL与MFC混合的经验有点欠缺。哦,另外,我可以看到你的问题,我也不是什么特别的人,所以我认为这是值得的。是的,这是可能的,我已经将MFC CView派生类移植到ATL,然后使用C++/CLI在HWndHost中实现。这很简单,工作也很好,但您会遇到空域问题,即无法在本机视图上覆盖WPF内容。您的组件是否能够在给定的DC上绘制?您是否可以分享一个组件的示例,并解释如何使用它?但我建议您的UI采用WPF,除非您正在开发需要框架的游戏,否则您将获得相同的性能和更好的可维护性。