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

StackOverflow https://stackoverflow.com/questions/413425

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение 2

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

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

m_bWindowOnly = true;

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top