【问题标题】:How to embed Windows Form in unmanaged ATL GUI?如何在非托管 ATL GUI 中嵌入 Windows 窗体?
【发布时间】:2010-10-13 03:03:46
【问题描述】:

我有一个使 COM 可见的 Windows 窗体用户控件。现在我想将该控件嵌入到 ATL 对话框 GUI 中。

ATL 项目(非托管 C++)只能获取 winform 的 progID 并在运行时动态创建和嵌入。

这可能吗?如果可以,我该怎么做?

【问题讨论】:

    标签: c++ winforms atl


    【解决方案1】:

    我不确定 ATL,但这可以在 MFC 中使用 CWinFormsView 和 CWinFormsControl 类轻松完成。

    我认为不支持在 ATL 窗口中托管 WinForm 控件,但我认为您可以通过简单地获取 winform 控件的 HWND 并将 ATL 控件设置为其父控件来实现。不过,这可能是一条艰难的道路。

    这似乎是类似的事情。不过我自己没有测试过。

    Link

    【讨论】:

    • 链接页面中描述的方法不适用,因为它是winform而不是ActiveX。 .Net 并不真正支持后者。以这种方式使用 winforms 时,会发生意想不到的事情。
    • 使用 CWinFormsControl 时,我必须提供一个现有的 winform 类名,因为它是一个模板。但是,我想用给定的 progID 创建一个任意的 winform。实际的类在编译时是未知的!
    【解决方案2】:

    我想出了一个让它工作的方法。
    下面的代码使用了一个名为 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2013-10-24
      相关资源
      最近更新 更多