代码之家  ›  专栏  ›  技术社区  ›  17 of 26

如何在MFC应用程序中承载WPF内容?

  •  17
  • 17 of 26  · 技术社区  · 16 年前

    MSDN Walkthrough 这让你大部分的路,但有几个关键的部分,我在别处发现。例如,演练告诉您将行[System::STAThreadAttribute]放在_tWinMain()定义之前,但是如果您正在实现标准MFC应用程序,那么您的源代码中就没有_tWinMain()。

    如果这里有什么不清楚的地方,请随意提问,我将编辑答案,使事情更清楚。

    1 回复  |  直到 16 年前
        1
  •  23
  •   17 of 26    16 年前

    步骤1:配置MFC应用程序以使用CLR支持进行编译

    实现本地C++和托管.NET代码之间互操作性的最好方法是将应用程序编译为托管C++而不是本机C++。这是通过转到项目的配置属性来完成的。在General下有一个选项“公共语言运行时支持”。将其设置为“公共语言运行时支持/clr”。

    步骤2:将WPF程序集添加到项目中

    步骤3:在MFC应用程序上设置STAThreadAttribute

    步骤4:创建HwndSource实例以包装WPF组件

    System::Windows::Interop::HwndSource是一个.NET类,用于处理MFC和.NET组件之间的交互。使用以下语法创建一个:

    System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew     System::Windows::Interop::HwndSourceParameters("MyWindowName");
    sourceParams->PositionX = x;
    sourceParams->PositionY = y;
    sourceParams->ParentWindow = System::IntPtr(hWndParent);
    sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD;
    
    System::Windows::Interop::HwndSource^ source = gcnew System::Windows::Interop::HwndSource(*sourceParams);
    source->SizeToContent = System::Windows::SizeToContent::WidthAndHeight;
    

    m_hWnd=(hWnd)源->Handle.ToPointer();

    源对象和关联的WPF内容将一直存在,直到您调用::DestroyWindow(m_hWnd)。

    步骤5:将WPF控件添加到HwndSource包装器

    System::Windows::Controls::WebBrowser^ browser = gcnew System::Windows::Controls::WebBrowser();
    
    browser->Height = height;
    browser->Width = width;
    source->RootVisual = browser;
    

    由于浏览器变量在我们退出创建函数后将超出范围,因此我们需要以某种方式保留对它的引用。托管对象不能是非托管对象的成员,但可以使用名为gcroot的包装模板来完成作业。

    将成员变量添加到对话框类:

    #include <vcclr.h>
    gcroot<System::Windows::Controls::WebBrowser^> m_webBrowser;
    

    m_webBrowser = browser;
    

    现在我们可以通过m_webBrowser访问WPF组件上的属性和方法。