非托管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;
}
}
具体可参见详细代码