非托管MFC调用WPF控件

本文介绍了如何在非托管的MFC或ActiveX环境中调用WPF控件。通过创建一个WPF UserControl并打包为wpf.dll,然后在WinForm中创建一个COM组件WF.dll,并利用WindowsFormsIntegration库实现互操作。设置COM可见性和注册COM组件后,MFC应用程序可以成功调用这些COM组件进行交互。
摘要由CSDN通过智能技术生成

非托管MFC/ActiveX调用WPF控件


WPF 做成UserControl ------> wpf.dll

public partial class WPFUserControl : UserControl
{
     public WPFUserControl() 
     {
            InitializeComponent();
     }
}


WinForm UserControl包含WPF.dll做成COM组件  ---------->WF.dll and WF.tlb

1)在WinForm 项目属性-->Application-->Assembly Information -->Make assembly COM-Visible 打钩

2)项目属性-->Build-->Register for COM interop 打钩

3)引用WPF项目所用到的引用,重点是要额外引用WindowsFormsIntergeration库

4)引用项目WPF

[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch),ComVisibleAttribute(true)]
public interface IWfUserCtrl
{
     [DispId(1)]
     bool setWindow(int width,int height);
}

[ComVisible(true), ClassInterface(ClassInterfaceType.None),  ProgId("IWfUserCtrl.1")]
public partial class WfContrastAgentGridCtrl : UserControl, IWfUserCtrl
{
     private WPFUserControl m_wpfUserCtrl;
     public WfContrastAgentGridCtrl() 
     {
            InitializeComponent();
            //Add WPF control inside Winform
            ElementHost elementHost = new ElementHost();
            m_wpfUserCtrl= new WPFUserControl ();
            elementHost.Child = m_wpfUserCtrl;
            elementHost.Dock = DockStyle.Fill;
            this.Controls.Add(elementHost);
     }
     
     public bool setWindow(int width,int height)
     {
            return true;
     }
}


 

由MFC调用COM组件tlb,运行COM组件dll

1)regasm.exe Com.dll

2)#import "Com.tlb" no_namespace

3)在dlg类的OnInitDialog()中使用

#define ID_VIEW_GRIDCTRL  111
const CString cstrlProgID(_T("IWfUserCtrl.1"));
class Dlg
{
      private:
           IWfUserCtrl * m_pUserCtrl;
           CWnd * m_WfWnd;
      protected:
           virtual BOOL OnInitDialog();;
}
BOOL Dlg::OnInitDialog() 
{
        BOOL locStat = FALSE;
        m_WfWnd= new CWnd();
        if (m_WfWnd== NULL)
        {
            cout<<"Create m_WfWnd failed"<<endl;
        }
                
        locStat = m_WfContrastAgentWnd->CreateControl(cstrlProgID,_T("IWfUserCtrl"),
            WS_CHILD | WS_VISIBLE, CRect(10,10,400,800),this,ID_VIEW_GRIDCTRL);
        if (!locStat)
        {
            cout<<"locStat is false"<<endl;
        }
        else
        {
            cout<<"locStat is true"<<endl;
        }
        
        LPUNKNOWN pUnknown = m_WfContrastAgentWnd->GetControlUnknown();
        
        LPVOID pCSInterface = NULL;
        HRESULT hr = pUnknown->QueryInterface(__uuidof(IWfContrastAgentGridCtrl),(void **)&pCSInterface);
        if (hr != S_OK)
        {
            cout<<"HRESULT hr is failed!"<<endl;
        }
        else
        {
            cout<<"hr == S_OK"<<endl;
            m_pUserCtrl= (IWfUserCtrl*)pCSInterface;
       }
}


具体可参见详细代码


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值