Здравствуйте Faust, Вы писали:
F>Еще как актуален!!!!!!!!!!!! F>Скинь плиз — denis_@mailru.com
Сбросил на мыло, ответа пока неет. Поэтому дублирую здесь, в конференции
=================================================
Привет!
Ну раз актуален, тогда пожалуйста. Приятно что и я могу хоть кого-то чему-то
научить — а то всё спрашиваю и спрашиваю. :-)
Основная идея такая:
CHtmlView использует WebBrouser — это тот же самый Internet Explorer.
IE предоставляет вещь под названием "объектная модель" — если ты писал под
JavaScript, то наверняка знаешь её — если нет, то коротко так — любой HTML
документ — это дерево объектов, у которых куча свойств. Достучаться до этих
объектов и свойств можно используя семейство IHTML... интерфейсов. Их тоже
очень много — практически на любую возможную мелочь.
Итак, цепочка действий для модификации HTML-кода такая:
1 Обязательно загружаешь в CHtmlView любой документ (Navigate2) (Можно
пустой, но он должен иметь тэг BODY)
2 Получаешь интерфейс IHTMLDocument2 — я бы сказал, что он корневой.
3 Затем от него получаешь интерфейс для управления нужным элементом
документа.
4 Через свойство put_innerHtml пишешь в него HTML-код
Напишу пример. За полную безошибочность кода не ручаюсь — выдираю куски кода
из разных место своего проекта. Нет времени сделать тестовый проект для
этого кода и отладить.
--------------------------------------------------
1 Обязательно загружаешь в CHtmlView любой документ (Navigate2) (Можно и
полностью пустой, но за это не ручаюсь. Лучше если, он будет иметь тэг
BODY — у меня работало так.)
CHtmlView::Navigate2(sPath, 0);
------------------------------------------------
2 Получаешь интерфейс IHTMLDocument2 — я бы сказал, что он корневой.
Последующий код лучше всего загнать в OnNavigateComplete2 — эта функция
вызывается, когда документ полностью загружен в IE и объектная модель
документа полностью сформирована.
// пройти по цепочке интерфейсов и добраться до IHtmlDocument2
CComPtr<IWebBrowser2> pWB;
CComPtr<IHTMLDocument2> m_pHtmlDoc
LPDISPATCH pDisp1;
CComPtr<IDispatch> pDisp2;
// достукиваемся до коллекции элементов
pDisp1 = GetApplication();
pDisp1->QueryInterface(IID_IWebBrowser2, (void**) &pWB); pWB->get_Document(&pDisp2);
pDisp2->QueryInterface(IID_IHTMLDocument2, (void**) &m_pHtmlDoc);
Можно сделать то же самое через метод CHtmlView::GetHtmlDocument. Он вернет
опять же LPDISPATCH, а от него — запросить IHTMLDocument2
------------------------------------
3 Затем от него получаешь интерфейс для управления нужным элементом. Как это
делается? Каждый объект документа — это элемент коллекции внутри IE. На
каждый HTML-тэг свой элемент, Можно добраться до этой коллекции, а затем от
неё получать элементы либо по их ID (к примеру есть в документе абзац вида
<P ID="myparagraph">, значит к нему можно обратиться прямо по его имени —
"myparagraph"). Либо можно последовательно перебирать все элементы
коллекции — пока не доберешься до нужного. В моем примере я использую доступ
прямой — по имени. Если придётся перебирать — посмотри методы
IHTMLElementCollection.
CComPtr<IHTMLElementCollection> m_pEC;
m_pHtmlDoc->get_all(&m_pEC);
COleVariant varElementName;
COleVariant varInd((long) 0, VT_I4);
CComBSTR bstrHtml;
CString sHtml(' ', CSTRINGBUFSIZE);
// вставляем подопытный элемент
CComPtr<IDispatch> pDisp4;
CComPtr<IHTMLElement> pElement;
// сначала создаем его HTML-код
........ — вырезано, в sHtml загоняется полное описание какого элемента
(например — "<P id=\"test\"> Текст абзаца </P>")
bstrHtml = sHtml;
m_pDivElement->put_innerHTML( (BSTR) bstrHtml);
// m_pDivElement — это моя специфичная переменная типа CComPtr<IHTMLElement>,
// указывает на <DIV> в который я и засовываю элементы
// читаем его (только что добавленного HTML-элемента) размеры в пикселах
if (pDataItem->m_sName == "")
AfxMessageBox("Не смогу получить размер элемента, не зная его имени"); //
у элемента нет имени — не смогу получить доступ
varElementName = pDataItem->m_sName;
m_pEC->item(varElementName, varInd, &pDisp4);
pDisp4->QueryInterface(IID_IHTMLElement, (void**) &pElement);
//тут к примеру можно поглучить доступ к свойствам элемента: ширине, высоте,
видимости, стилям .... и т.д. —
Что еще? Чтобы получше узнать структуру объектной модели, я в свое время
потратил пару недель на DHTML — всё, что в нем есть имеет аналоги и в виде
IHTML-интерфейсов.
Будут еще вопросы по этой теме — пиши, с удовольствием расскажу, что знаю.