【问题标题】:How do I get the HWND for an ActiveX control after the control has been initialised/activated?初始化/激活控件后,如何获取 ActiveX 控件的 HWND?
【发布时间】:2009-01-05 15:19:14
【问题描述】:

我正在使用 Visual Studio 2008 在 C++ 中创建一个基于 ATL 8.0 的 ActiveX 控件。我需要创建一个子窗口并将其附加到 ActiveX 控件。

如何访问 ActiveX 控件拥有的 HWND?

在创建控件的窗口后,为了使用 HWND,我可以重写哪个 ATL 函数?

【问题讨论】:

    标签: c++ activex atl


    【解决方案1】:

    ActiveX 将允许您在自己的接口上定义自己的方法(以解决 Brians 的假设),但这在这里可能无济于事。 ActiveX 控件很可能是由另一个组件创建的。 ATL 也无关紧要——它是一个包装 COM 接口的 C++ 模板库。

    这里需要的函数是IOleWindow::GetWindow。我不确定“覆盖 ATL 函数以使用 HWMD”是什么意思。检索到 HWND 后,您可以将其传递给任何使用 HWND 的函数。例如,作为 SetParent(child, parent) 中的父级

    【讨论】:

    • 向导生成一个 ATL ActiveX 控件,该控件具有(通过一个基类)一个 m_hWnd 成员。然而,这似乎总是 NULL,这是我的问题。这应该如何以及何时初始化?
    【解决方案2】:

    经过反复试验,我找到了我想要的答案。

    在 ATL ActiveX 控件的构造函数中添加以下代码行:

    m_bWindowOnly = true;
    

    这会导致创建控件的窗口(而不仅仅是重用父窗口的 HWND)。此后,控件类的 m_hWnd 成员可用于访问控件窗口的 HWND。

    【讨论】:

    • 刚刚把我的头撞在墙上 - 这解决了它 - 你还记得你在哪里读到这个吗?
    • 我不记得了,抱歉,我可能只是通过实验才弄明白的。我很难找到相关的 ActiveX 信息。
    【解决方案3】:

    [完全披露]:我对 ActiveX 或 ATL 不太熟悉,但我希望这至少有点帮助。

    如果 ActiveX 允许您在对象上定义任意方法,请尝试公开一个您可以调用的函数,该函数将简单地将 HWND 的值返回给您(控件几乎可以肯定知道它自己的 HWND)。这样您就可以调用GetActiveXHwnd() 来获取必要的句柄,然后您可以将其用于进一步操作。

    【讨论】:

    • 是的,它知道它是自己的 HWND,但它似乎永远不会被初始化。我可以添加一个函数来返回 m_hWnd 成员,但它只会返回 NULL。我想知道应该如何以及何时初始化 HWND?
    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2023-03-20
    • 2011-08-01
    • 2019-11-13
    相关资源
    最近更新 更多