2

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

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

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

4

3 回答 3

2

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

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

于 2009-01-06T08:32:54.883 回答
2

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

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

m_bWindowOnly = true;

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

于 2009-01-07T14:40:05.157 回答
-1

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

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

于 2009-01-05T21:58:00.700 回答