Как получить HWND для элемента управления ActiveX после того, как элемент управления был инициализирован / активирован? - PullRequest
2 голосов
/ 05 января 2009

Я создаю элемент управления ActiveX на основе ATL 8.0 в C ++ с использованием Visual Studio 2008. Мне нужно создать подокно и присоединить его к элементу управления ActiveX.

Как получить доступ к HWND, принадлежащему элементу управления ActiveX?

Какую функцию ATL можно переопределить, чтобы использовать HWND после создания окна элемента управления?

Ответы [ 3 ]

2 голосов
/ 06 января 2009

ActiveX позволит вам определять ваши собственные методы на вашем собственном интерфейсе (чтобы учесть предположение Бриана), но это, скорее всего, здесь не поможет. Элемент управления ActiveX вполне может быть создан другим компонентом. ATL тоже не имеет значения - это библиотека шаблонов C ++, которая оборачивает интерфейсы COM.

Здесь вам нужна функция IOleWindow :: GetWindow. Я не уверен, что вы подразумеваете под "переопределением функции ATL для использования HWMD". После того, как вы получили HWND, вы можете передать его любой функции, которая использует HWND. Например, в качестве родителя в SetParent (child, parent)

2 голосов
/ 07 января 2009

После некоторых проб и ошибок, и я нашел ответ, который был после.

В конструкторе элемента управления ActiveX ATL вам необходимо добавить следующую строку кода:

m_bWindowOnly = true;

Это вызывает создание окна для элемента управления (а не просто повторное использование HWND родительского окна). После этого член m_hWnd класса управления может использоваться для доступа к HWND для окна элемента управления.

0 голосов
/ 06 января 2009

[Полное раскрытие]: я не очень знаком с ActiveX или ATL, но надеюсь, что это, по крайней мере, несколько полезно.

Если ActiveX позволяет вам определять произвольные методы для вашего объекта, попробуйте представить функцию, которую вы можете вызвать, которая просто вернет вам значение HWND (элемент управления почти наверняка знает свой собственный HWND). Таким образом, вы можете вызвать GetActiveXHwnd(), чтобы получить необходимый дескриптор, который вы затем использовали бы для дальнейшей манипуляции.

...