我正在使用Visual Studio 2008在C ++中创建基于ATL 8.0的ActiveX控件。我需要创建一个子窗口并将其附加到ActiveX控件。
如何访问ActiveX控件所拥有的HWND?
在创建控件窗口后,为了使用HWND,我可以覆盖哪个ATL功能?
答案 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()
来获得必要的句柄,然后用它来进一步操作。