На этом шаге мы рассмотрим алгоритм создания элемента управления HTML средствами ATL.
Средства ATL позволяют создавать элементы управления, способные отображать HTML-страницы. Элемент управления HTML (HTML Control) содержит элемент управления WebBrowser и предоставляет указатель на интерфейс IWebBrowser2 Automation, обеспечивающий доступ к объектной модели DHTML.
Как и любой другой элемент управления на базе ATL, HTML-элемент содержит пустой диспетчерский интерфейс, в который Вы можете добавлять свои методы и свойства, определяя таким образом порядок взаимодействия Вашего элемента управления с контейнером. Кроме этого, HTML-элемент предоставляет еще один диспетчерский интерфейс, служащий для связи между кодом на C++ и пользовательским интерфейсом на основе HTML. Последний посредством диспетчерского интерфейса обращается к коду C++. Это позволяет создавать на языке C++ методы, вызываемые из сценария HTML-страницы.
В HTML-элементе на базе ATL содержится HTML-ресурс - пример пользовательского интерфейса этого элемента управления, а также метод, демонстрирующий написание функции, которая вызывается пользовательским интерфейсом на основе HTML.
Сейчас мы создадим простой элемент управления HTML средствами ATL.
Рис.1. Мастер ATL Object Wizard
Рис.2. Диалоговое окно ATL Object Wizard Properties
<HTML> <BODY id=theBody> <BUTTON onclick='window.external.OnClick(theBody, "red");'>Red</BUTTON> <BR> <BR> <BUTTON onclick='window.external.OnClick(theBody, "green");'> Green</BUTTON> <BR> <BR> <BUTTON onclick='window.external.OnClick(theBody, "blue");'>Blue</BUTTON> </BODY> </HTML>
Этот простой DHTML-код определяет три кнопки, каждая из которых реагирует на событие onclick вызовом функции OnClick(). Э функция принимает два параметра - идентификатор элемента и строку со значением одного из цветов палитры Internet Explorer.
Функция OnClick() не имеет отношения к объектной модели DHTML, а представляет собой метод интерфейса IMyHtmlCtrlUI, определенного мастером ATL Object Wizard. Свойства и методы интерфейса IMyHtmlCtrlUI, вызываемые из DHTML-кода Вашего элемента управления, задаются посредством объекта window.external.
Ниже приведена реализация функции IMyHtmlCtrlUI::OnClick() из заголовочного файла MyHtmlCtrl.h:
// Пример метода, вызываемого из HTML для изменения // цвета фона элемента <B0DY> STDMETHOD(OnClick)(IDispatch* pdispBody, VARIANT varColor) { CComQIPtr<IHTMLBodyElement> spBody(pdispBody); if (spBody != NULL) spBody->put_bgColor(varColor); return S_OK; }
Функция OnClick() принимает указатель IDispatch на элемент DHTML-страницы и переменную типа VARIANT со строкой цвета. OnClick() применяет класс ATL CComQIPtr для получения из диспетчерского интерфейса элемента "интеллектуального" указателя на интерфейс IHTMLBodyElement. При успешном получении указателя на интерфейс IHTMLBodyElement (элемент <BODY> передан корректно) вызывается метод put_bgColor() для задания фонового цвета тела документа.
Созданное приложение можно взять здесь (31,9 Кб).
На следующем шаге мы рассмотрим действия, которые надо выполнить для проверки корректности работы элемента управления MyHtmlCtrl.