我有一个使 COM 可见的 Windows 窗体用户控件。现在我想将该控件嵌入到 ATL 对话框 GUI 中。
ATL 项目(非托管 C++)只能获取 winform 的 progID 并在运行时动态创建和嵌入它。
这可能吗?如果可以,我该怎么做?
我不确定 ATL,但这可以在 MFC 中使用 CWinFormsView 和 CWinFormsControl 类轻松完成。
我认为没有bulitin 支持在ATL 窗口中托管WinForm 控件,但我认为您可以通过简单地获取winform 控件的HWND 并将您的ATL 控件设置为其父级来实现。不过,这可能是一条艰难的道路。
这似乎是一种类似的事情。虽然我自己没有测试过。
我想出了一个让它工作的方法。
下面的代码使用了一个名为 m_Control 的 CWnd,它通过 CreateControl 的一个小文档版本来托管一个 winform。到目前为止似乎工作正常。如果有人看到任何缺点,请发表评论或回复。
AfxEnableControlContainer();
Microsoft::VisualC::MFC::CControlCreationInfoEx i;
i.Init(System::Type::GetTypeFromProgID(gcnew System::String(sProgID)),
CControlCreationInfo::ReflectionType);
i.m_clsid = CLSID_WinFormsControl;
POINT pt;
pt.x = pt.y = 0;
SIZE sz;
sz.cx = sz.cy = 100;
m_Control.CreateControl(i, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
&pt, &sz, CWnd::FromHandle(m_hWnd), ID_CONTROL);