Контролы и контейнеры
От: rus-k  
Дата: 31.07.09 06:42
Оценка:
Добрый день. Встала задача написать контейнер. Пока разбирался, возникло ощущение, что все эти контейнеры — это поделка Микрософта, недокументированная, в которой можно разобраться только по исходникам. Благо они есть.

Но это я отвлекся. В поисках информации натолкнулся на вот эту статью: Write ActiveX Controls Using Custom Interfaces Provided by ATL 3.0. Очень полезная статья, хоть и старая. С одной стороны закрылись многие непонятные места, с другой стороны, возникли вопросы по самой концепции отношений контрола и контейнера. Концепция такова:

1. В контейнере может быть произвольное число контролов.
2. Контейнер должен предоставлять контролу окно. Это не обязательно окно контейнера — это просто какое-то окно. Окно нужно контролу для взаимодействия с пользователем. Предоставляемое окно может быть "личным" для контрола или общим (windowless). Из всего этого делается вывод, что контейнером могут быть: окно, диалог, контрол (композитный).
3. У контрола может быть собственное окно, либо может не быть оного (windowless).
4. Для создания контрола Микрософт предлагает создать специальное окно CAxHostWindow, которое с одной стороны является окном, а с другой поддерживает набор интерфесов, требуемых от контейнера. В дальнейшем контейнер работает с этим окном CAxHostWindow, как с обычным окном: перемещает, меняет размер, показывает и т.п. Окно CAxHostWindow через свои интерфейсы ретранслирует эти события контролу. В окне CAxHostWindow может быть только один контрол. Таков интерфейс IAxWinHostWindow.
5. Т.о. создание контрола выливается в создание 2 сущностей: родительского окна и самого контрола. При этом, контрол может иметь свое собственное окно или пользоваться родительским окном.

Вопрос №1:
Что мы в итоге получаем: при создании N контролов создается минимум N окон (все windowless), максимум 2*N окон (ни один не windowless). Даже если все контролы windowless, все равно у каждого контрола свое содержащее его окно. Заявлялось, что окна у них общие, но реализация показывает, что нифига не общие.

Вопрос №2:
Композитный контрол может быть контейнером. Хотя судя по реализации получается, что суть композитного контрола в том, что для него в фазе design-time создается ресурс, который потом в run-time патчится с тем, чтобы захостить контролы. Т.о. композитный контрол нужен для статического хостинга контролов. Если же мне нужно контролы хостить динамически, то зачем мне композитный контрол? Я могу взять обычный контрол, не windowless. У него будет свое окно, поверх него я буду создавать окна CAxHostWindow, в которых будут существовать мои контролы. Получается, что контрол не обязательно должен быть композитным для хостинга контролов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.