[WPF编程]WPF程序内使用MFC框架

主要方法(1): 1.将MFC做的封装成dll或ActiveX控件。 2.使用C++/CLI,在一个工程下可以使用WPF,还能使用MFC。  
主要方法(2): 
不需要,你可以使用HwndHost来Host你原来内容。这是一个抽象类,需要你自己实现BuildWindowCore和DestoryWindowCore两个方法。  在BuildWindowCore里面创建你的MFC组件实例,然后返回它的指针; DestoryWindowCore就是如何销毁你创建的组件。  HwndHost还提供一个WndProc的virutal方法,你可以重载这个方法来处理windows消息。  如果你想偷懒,也可以使用WindowsFormsHost,在里面放一个WinForm的Panel控件,接着创建你的MFC组件,然后调用SetParent API把你的MFC组件贴到这个Panel就行了   出自于:http://zhidao.baidu.com/question/193783598.html  主要方法(3):  
   
   
   
   
2011-10-26 10:06  61人阅读  评论(2)  收藏  举报

        就这段时间处理在wpf下调用MFC DLL所遇到的种种问题,与大家一起分享一下,与大家一起进步。

      准备条件:

    我手中有一个mfc dll文件,该文件相当于一个图形界面控件。它有一个导出函数,该导出函数需要一个父句柄(hwndParent)的输入。同时,返回该控件的对象指针。

       同时,我手中还有关于这个控件的一些纯虚头文件,以及继承子类的一些实现。

       第一次尝试:

      之前已有听说,wpf下是不能使用mfc dll的,wpf中不存在句柄的概念。但是,工作上要求,必须得测试一下,不行得给出确切的不行的原因。

        首先,要说明一下的是wpf是有个主窗口父句柄的。可以用IntPtr handle = new WindowInteropHelper(this).Handle;方法得到。

        刚开始时,我是将那些关于控件类的纯虚头文件全部转换成wpf的类文件。但是,发现一个问题,wpf的抽象类是不允许声明抽象类的指针类型的。这样,我调用dll导出函数的返回值就无法保存下来。更不用说调用其中的一些方法了。

        而且这样做的另外一个问题是,很有可能MFC的类模型,与wpf不相同,如果是这样的话,那么类中对应成员函数的内存指针也有可能不同,那么我调用wpf中类成员方法,跟调用mfc类成员方法肯定是不一样的。所以得以验证这种方法是不可行的。

       第二次尝试:

      就在这个时候,我想到让dll的创建者,给我再度封装,只提供给我接口,而不需要我再去做调用类成员的方法。最后,dll创建者不愿意去做这项工作。而自己把这项工作交付给了我。让我自己再封装一层dll。说实话,我推荐不要像我这样做。因为几个dll,最后自己都会搞糊涂了。到底哪个dll是什么时候生成,怎么个路径关系,不过这里我将这几个工程全部都放在了一个工程中,然后将所有的输出路径都改为同一个路径。

       这样封装之后,操作起来基本上就无大碍了,但是却一直会出现一个异常,或系统崩溃的问题。

       经过调试过程,在dll中输出一个AfxMessageBox(“test”);最后测试得知,原来是AfxGetResourceHandle();这句有问题。(这里得说明的是wpf与mfc dll是不支持调试调用的)。上网查过资料才知道,原来该函数,所执行获取的是当前进程的信息,自然跟之前的dll没有关系,而实际上我是想获取dll的相关信息。这样一来,就自然会出现问题了。于是将此处一改发现问题居然解决了。

       wpf下用IntPtr类型给mfc传递句柄HWND,mfc返回的句柄用IntPtr类型接受。如此便可以实现MFC的界面在WPF上显示了。

       另外两种做法:

      在我翻书的过程中,我发现了wpf实际上提供有调用win32的基类hwndhost。

        通过重载hwndhost,相当于创建了一个win32平台的控件在wpf下的实现。其中是需要重载BuildWindowCore、DestroyWindowCore函数。同时还可以重载一个消息进程。将wpf的消息传递到win32控件上。

        这种方法与我第二次尝试的操作差不多,就不用多说了。

      

        另外一种方法:是我一个同事测试出来的,他讲mfc的dll制作成一个exe。然后将这个exe添加到了wpf界面中,实质上是运行了两个进程。他只用了两天就想出这种解决方法,实在是人才啊,这里赞一个。 出自于:http://blog.csdn.net/meiyuli/article/details/6905991

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值