2009-01-05 35 views

回答

2

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

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

m_bWindowOnly = true; 

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

+0

刚才我的头靠在墙上 - 这解决了它 - 你还记得你在哪里读到这个? – 2010-09-13 13:28:02

-1

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

如果ActiveX允许你在你的对象上定义任意方法,试着公开一个你可以调用的函数,它只是简单地向你返回HWND的值(控件几乎肯定知道它自己的HWND)。通过这种方式,您可以拨打GetActiveXHwnd()获取必要的句柄,然后您可以使用该句柄进行进一步操作。

+0

是的,它知道它是自己的HWND,它似乎从来没有被初始化。我可以添加一个函数来返回m_hWnd成员,但它只会返回NULL。我想知道HWND应该如何以及何时初始化? – 2009-01-06 08:38:22

1

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

你需要的函数是IOleWindow :: GetWindow。我不确定你的意思是“覆盖ATL函数来使用HWMD”。一旦检索到HWND,就可以将它传递给使用HWND的任何函数。例如,作为SetParent(子,父)的父亲

+0

该向导生成一个ATL ActiveX控件,该控件具有(通过基类)m_hWnd成员。但是,这总是显示为NULL,这是我的问题。这应该如何以及什么时候被初始化? – 2009-01-06 08:36:45