Люди добрые помогите !
Подскажите, пожалуйса, как можно перед отображением HTML-документа в классе CHtmlView получить доступ к самому документу для его изменения с последующим отображением.
Заглянул в форум на RSDN и заметил твой вопрос
Если он еще актуален — могу прислать примерное описание того, как я это делал. Благо делал это совем недавно.
Успехов
Кабаев Сергей
Здравствуйте SergPas, Вы писали:
SP>Люди добрые помогите ! SP>Подскажите, пожалуйса, как можно перед отображением HTML-документа в классе CHtmlView получить доступ к самому документу для его изменения с последующим отображением.
Здравствуйте KSN, Вы писали:
KSN>Привет!
KSN>Заглянул в форум на RSDN и заметил твой вопрос KSN>Если он еще актуален — могу прислать примерное описание того, как я это делал. Благо делал это совем недавно.
KSN>Успехов KSN>Кабаев Сергей
KSN>Здравствуйте SergPas, Вы писали:
SP>>Люди добрые помогите ! SP>>Подскажите, пожалуйса, как можно перед отображением HTML-документа в классе CHtmlView получить доступ к самому документу для его изменения с последующим отображением.
Еще как актуален!!!!!!!!!!!!
Скинь плиз — denis_@mailru.com
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
Re[3]: CHtmlView - как получить HTML
От:
Аноним
Дата:
16.11.01 07:40
Оценка:
Здравствуйте 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-интерфейсов.
Будут еще вопросы по этой теме — пиши, с удовольствием расскажу, что знаю.
Успехов,
Кабаев Сергей
=================================================
Re[4]: CHtmlView - как получить HTML
От:
Аноним
Дата:
16.11.01 08:46
Оценка:
Здравствуйте Аноним, Вы писали:
А>Здравствуйте 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);
А>//тут к примеру можно поглучить доступ к свойствам элемента: ширине, высоте, А>видимости, стилям .... и т.д. -
А> pElement->get_offsetHeight(&lHeight); А> pElement->get_offsetWidth(&lWidth); А> // удаляем подопытный элемент А> bstrHtml = CString(""); А> m_pDivElement->put_innerHTML( (BSTR) bstrHtml);
А>Что еще? Чтобы получше узнать структуру объектной модели, я в свое время А>потратил пару недель на DHTML — всё, что в нем есть имеет аналоги и в виде А>IHTML-интерфейсов.
А>Будут еще вопросы по этой теме — пиши, с удовольствием расскажу, что знаю.
А>Успехов, А>Кабаев Сергей
Это все понятно.............
А как получить документ до загрузки, например, указывая путь к файлу и счивая его, причем, иметь при этом такую же структуру которую предоставляют IHTML... интерфейсы?
Спасибо за заботу.....
Кстати, есть ли у тебя Platform SDK 2001?
Мне жуть как нужен заголовочный файл mshtml.h из этого комплекта. Если есть такая возможность, то буду очень благодарен.
А>Кстати, есть ли у тебя Platform SDK 2001? А>Мне жуть как нужен заголовочный файл mshtml.h из этого комплекта. Если есть такая возможность, то буду очень благодарен.
Привет еще раз
А>Это все понятно............. А>А как получить документ до загрузки, например, указывая путь к файлу и счивая его, причем, иметь при этом такую же структуру которую предоставляют IHTML... интерфейсы?
Ага, так вот где собака порылась!
Правда не совсем понятно "...и счивая его....".
Если это "скачивая его" — то наверное можно просто не показывать документ — скрыть его как-либо;или через свойства HTML (так можно) или скрыть фрейм, на котором лежит CHtmlView.
Если "не скачивая его" — тогда не знаю. Это значит, что нужно будет таки его прочитать, потом заняться распознаванием HTML-кода .... С таким не сталкивался, советовать нечего.
А>Кстати, есть ли у тебя Platform SDK 2001?
Нет, SDK нет.
А>Мне жуть как нужен заголовочный файл mshtml.h из этого комплекта. Если есть такая возможность, то буду очень благодарен.
Есть mshtml.h из комплекта заголовчных файлов для IE 5.5. Этот комплект является подмножеством SDK.
Могу сбросить.
Успехов
Кабаев Сергей
Re[2]: CHtmlView - как получить HTML
От:
Аноним
Дата:
16.11.01 11:56
Оценка:
Здравствуйте KSN, Вы писали:
KSN>Привет!
KSN>Заглянул в форум на RSDN и заметил твой вопрос KSN>Если он еще актуален — могу прислать примерное описание того, как я это делал. Благо делал это совем недавно.
Огромное спасибо за подсказку, вопрос актуален, буду разбираться.
Здравствуйте KSN, Вы писали:
KSN>Привет еще раз
А>>Это все понятно............. А>>А как получить документ до загрузки, например, указывая путь к файлу и счивая его, причем, иметь при этом такую же структуру которую предоставляют IHTML... интерфейсы? KSN>Ага, так вот где собака порылась! KSN>Правда не совсем понятно "...и счивая его....". KSN>Если это "скачивая его" — то наверное можно просто не показывать документ — скрыть его как-либо;или через свойства HTML (так можно) или скрыть фрейм, на котором лежит CHtmlView. KSN>Если "не скачивая его" — тогда не знаю. Это значит, что нужно будет таки его прочитать, потом заняться распознаванием HTML-кода .... С таким не сталкивался, советовать нечего.
А>>Кстати, есть ли у тебя Platform SDK 2001? KSN>Нет, SDK нет.
А>>Мне жуть как нужен заголовочный файл mshtml.h из этого комплекта. Если есть такая возможность, то буду очень благодарен. KSN>Есть mshtml.h из комплекта заголовчных файлов для IE 5.5. Этот комплект является подмножеством SDK. KSN>Могу сбросить.
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
Здравствуйте KSN, Вы писали:
KSN>Привет еще раз
А>>Это все понятно............. А>>А как получить документ до загрузки, например, указывая путь к файлу и счивая его, причем, иметь при этом такую же структуру которую предоставляют IHTML... интерфейсы? KSN>Ага, так вот где собака порылась! KSN>Правда не совсем понятно "...и счивая его....". KSN>Если это "скачивая его" — то наверное можно просто не показывать документ — скрыть его как-либо;или через свойства HTML (так можно) или скрыть фрейм, на котором лежит CHtmlView. KSN>Если "не скачивая его" — тогда не знаю. Это значит, что нужно будет таки его прочитать, потом заняться распознаванием HTML-кода .... С таким не сталкивался, советовать нечего.
А>>Кстати, есть ли у тебя Platform SDK 2001? KSN>Нет, SDK нет.
А>>Мне жуть как нужен заголовочный файл mshtml.h из этого комплекта. Если есть такая возможность, то буду очень благодарен. KSN>Есть mshtml.h из комплекта заголовчных файлов для IE 5.5. Этот комплект является подмножеством SDK. KSN>Могу сбросить.
Извини за задержку с ответом...............
скинь плиз(denis_@mailru.com) mshtml.h, нужен как воздух............
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...
Re: CHtmlView - как получить HTML
От:
Аноним
Дата:
23.03.06 09:41
Оценка:
Все это работает, но до момента появления в коде HTML-файла тега <script>.
Количество элементов в коллекции IHTMLElementCollection взятых из IHTMLDocument2 функцией get_all
равно количеству тегов стоящих до тега <script>.
Подскажите пожалуйста в чем дело.
Аноним wrote:
> Все это работает, но до момента появления в коде HTML-файла тега <script>. > Количество элементов в коллекции IHTMLElementCollection взятых из > IHTMLDocument2 функцией get_all > равно количеству тегов стоящих до тега <script>. > Подскажите пожалуйста в чем дело.
Я не использую all. Зачем?
CHtmlView::GetHtmlDocument
Аноним wrote:
> Спасибо. > Не сочтёте наглостью, если попрошу кусочек для примера чуть побольше.
Не сочтёте навязчивостью, если попрошу сформулировать задачу точнее, для которой вы хотите кусочек примера.
Ибо получение доступа к документу у меня демонстрируется полностью.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: CHtmlView - как получить HTML
От:
Аноним
Дата:
24.03.06 07:11
Оценка:
Здравствуйте, kan_izh.
Есть вид на основе CHtmlView. Туда загружается шаблон отчета в формате HTML. Цель всего этого: заполнить <INPUT>-ы ранее подготовленными данными. Далее послать команду форме на отправку данных.
Среда VC++6.0
Андрей.
Аноним wrote:
> Здравствуйте, kan_izh. > Есть вид на основе CHtmlView. Туда загружается шаблон отчета в формате > HTML. Цель всего этого: заполнить <INPUT>-ы ранее подготовленными > данными. Далее послать команду форме на отправку данных.
А тебе это юзеру показывать надо? Может тебе просто post запрос нужно послать и тебе не нужен HTML View?
//где-нибудь в .h:#import <mshtml.tlb> named_guids
...
void CMyHTMLView::OnSomethingClick()
{
MSHTML::IHTMLDocument3Ptr doc3 = GetHtmlDocument();
MSHTML::IHTMLDocument2Ptr doc2 = doc3;
MSHTML::IHTMLInputElementPtr e = doc3->getElementById(_T("text-elem-id"));
e->value = _T("blah");
MSHTML::IHTMLInputElementPtr e = doc3->getElementById(_T("checkbox-elem-id"));
e->checked = true;
MSHTML::IHTMLFormElementPtr form = doc2->forms->item(0);
form->submit();
}
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: CHtmlView - как получить HTML
От:
Аноним
Дата:
24.03.06 11:47
Оценка:
Здравствуйте, kan_izh
От юзера требуется проверить предложенные данные и нажать кнопочку "Да". Типа это он тут главный
Я первый раз сталкиваюсь с СHtmlView. Спасибо за подсказку, пойду углублять знания. С налету не вышло.