【发布时间】:2009-01-05 15:19:14
【问题描述】:
我正在使用 Visual Studio 2008 在 C++ 中创建一个基于 ATL 8.0 的 ActiveX 控件。我需要创建一个子窗口并将其附加到 ActiveX 控件。
如何访问 ActiveX 控件拥有的 HWND?
在创建控件的窗口后,为了使用 HWND,我可以重写哪个 ATL 函数?
【问题讨论】:
我正在使用 Visual Studio 2008 在 C++ 中创建一个基于 ATL 8.0 的 ActiveX 控件。我需要创建一个子窗口并将其附加到 ActiveX 控件。
如何访问 ActiveX 控件拥有的 HWND?
在创建控件的窗口后,为了使用 HWND,我可以重写哪个 ATL 函数?
【问题讨论】:
ActiveX 将允许您在自己的接口上定义自己的方法(以解决 Brians 的假设),但这在这里可能无济于事。 ActiveX 控件很可能是由另一个组件创建的。 ATL 也无关紧要——它是一个包装 COM 接口的 C++ 模板库。
这里需要的函数是IOleWindow::GetWindow。我不确定“覆盖 ATL 函数以使用 HWMD”是什么意思。检索到 HWND 后,您可以将其传递给任何使用 HWND 的函数。例如,作为 SetParent(child, parent) 中的父级
【讨论】:
经过反复试验,我找到了我想要的答案。
在 ATL ActiveX 控件的构造函数中添加以下代码行:
m_bWindowOnly = true;
这会导致创建控件的窗口(而不仅仅是重用父窗口的 HWND)。此后,控件类的 m_hWnd 成员可用于访问控件窗口的 HWND。
【讨论】:
[完全披露]:我对 ActiveX 或 ATL 不太熟悉,但我希望这至少有点帮助。
如果 ActiveX 允许您在对象上定义任意方法,请尝试公开一个您可以调用的函数,该函数将简单地将 HWND 的值返回给您(控件几乎可以肯定知道它自己的 HWND)。这样您就可以调用GetActiveXHwnd() 来获取必要的句柄,然后您可以将其用于进一步操作。
【讨论】: