初始化/激活控件后,如何获取ActiveX控件的HWND?

时间:2009-01-05 15:19:14

标签: c++ activex atl

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

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

在创建控件窗口后,为了使用HWND,我可以覆盖哪个ATL功能?

3 个答案:

答案 0 :(得分:2)

ActiveX允许您在自己的界面上定义自己的方法(以解决Brians假设),但这可能对此没有帮助。 ActiveX控件可能很好地由另一个组件创建。 ATL也无关紧要 - 它是一个包装COM接口的C ++模板库。

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

答案 1 :(得分:2)

经过一些试验和错误,我找到了我想要的答案。

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

m_bWindowOnly = true;

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

答案 2 :(得分:-1)

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

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