Браузер на Api
Честно говоря, я толком пока даже не понимаю, с какой стороны к этому подойти.
Мне нужен сам принцип создания GUI загруженной страницы, а не обработка полученного текста или получение информации из инета - это все просто.
ЗЫ сейчас я сижу на GPRS'е, поэтому поиск очень накладный получается, даже с отключенными картинками.
ЗЫЗЫ просьба не спрашивать: "а зачем тебе оно нужно?" Знаю, что мазохизм, но нужно.
Мне нужен сам принцип создания GUI загруженной страницы, а не обработка полученного текста или получение информации из инета - это все просто.
Первое, что приходит в голову - посмотреть исходники Lynx. Помнится, даже под Turbo Vision его порт был, только очень ужасный.
Первое, что приходит в голову - посмотреть исходники Lynx. Помнится, даже под Turbo Vision его порт был, только очень ужасный.
А где их под винды достать? Можно мне ссылочку - помниться кто-то хвастался, что у него инета 30 Гб лимит ;)
А где их под винды достать? Можно мне ссылочку - помниться кто-то хвастался, что у него инета 30 Гб лимит ;)
Только времени у меня почему-то 24 часа в сутках, как и у остальных, а не 30. :(
Только времени у меня почему-то 24 часа в сутках, как и у остальных, а не 30. :(
Ну-ну, все с вами понятно, так и запишем :).
Objects: array[0..99]
Object = record
Type: Byte; // кнопка, рисунок и т.д
Width: Word;
Height: Word;
....
URL: String[99]; // для рисунка URL, для кнопки(формы) ActionURL
AdditionalInfo: String[19]; // для формы GET или POST, для кнопки Submit, Reset или Button
end;
Потом в функции окна выводишь в for'е
Создаешь массив например(на Delphi):
Внимательно мой первый пост читали? :)
Objects: array[0..99]
Object = record
Type: Byte; // кнопка, рисунок и т.д
Width: Word;
Height: Word;
....
URL: String[99]; // для рисунка URL, для кнопки(формы) ActionURL
AdditionalInfo: String[19]; // для формы GET или POST, для кнопки Submit, Reset или Button
end;
Потом в функции окна выводишь в for'е
Может я неправильно уловил суть, но каким образом тогда можно будет создавать таблицы? Или обрабатывать теги типа <hr> - ведь у него задается ширина в процентах/пикселах. Если задать в процентах, то при изменении размера окна нужно будет динамически менять длинну. То же самое и с таблицами. А ведь они еще и должны содержать в себе текс который должен будет переформатироваться при изменении размера таблицы.
Ух! Тяжко как то оно :(
Каким образом можно создать примитивный браузер на API? Т.е. не использовать ничего типа Билдера или Делфей.
А notepad использовать можно? :)
А как на счет IWebBrowser2 ?
Мне нужен сам принцип создания GUI загруженной страницы,
Смотри исходники firefox (mozilla.org).
Там все довольно понятно и структурированно.
За одно разберешься с Gecko.
обработка полученного текста или получение информации из инета - это все просто.
Ну-ну... Во истину несведущие люди - самые бесстрашные люди.
А notepad использовать можно? :)
Можно.
А как на счет IWebBrowser2 ?
Э-э-э... Ни как. Не знаю что это такое. Будем смотреть.
Смотри исходники firefox (mozilla.org).
Там все довольно понятно и структурированно.
За одно разберешься с Gecko.
Спасибо за ссылку ;)
Green, за полного дятла меня держите? Думаете, что сидя на файерфоксе у меня не хватило ума дойти до того, что раз у него open source, то и исходники можно самому посмотреть?
Опять-таки, невнимательно первый пост читали: сижу на GPRS! Мне пока слабо выкачать 30 Мб на GPRS'е. Просто денег не хватит. Может на такое дело переведете мне на счет пару сотенок ;)
В этом и состоит суть моей просьбы: нужны исходники именно той части браузера, которая создает страницу и больше ничего! Их будет думаю значительно меньше чем 30 Мб.
Ну-ну... Во истину несведущие люди - самые бесстрашные люди.
Действительно...
Green, вы как всегда - в своем репертуаре. Просили по человечески помочь. Вы решили вместо этого дать "указания свыше" даже не зная сути проекта. Спасибо. От этого не легче.
Лучше бы кусок файерфокса выслали или ссылку путёвую дали по IWebBrowser2 - я пока нашел только всякий хлам, зато трафика извел немеряно...
Э-э-э... Ни как. Не знаю что это такое. Будем смотреть.
Это COM интерфейс MS IE.
Его можно встроить в своё приложение.
Спасибо за ссылку ;)
Green, за полного дятла меня держите? Думаете, что сидя на файерфоксе у меня не хватило ума дойти до того, что раз у него open source, то и исходники можно самому посмотреть?
Ну я же не телепат...
В этом и состоит суть моей просьбы: нужны исходники именно той части браузера, которая создает страницу и больше ничего! Их будет думаю значительно меньше чем 30 Мб.
Хм... Думаю будет сложновато понять без компиляции всего проекта.
Действительно...
Green, вы как всегда - в своем репертуаре. Просили по человечески помочь. Вы решили вместо этого дать "указания свыше" даже не зная сути проекта. Спасибо. От этого не легче.
Хочешь получить конкретный ответ - задавай конкретный вопрос.
Сути проекта я, действительно, не знаю, т.к. ты не потрудился объяснить.
Как я представляю процесс предоставления обычной HTML-страницы можно разбить на след этапы:
1. Получение документа по запросу. Это не так просто, как тебе кажется, о чем я собственно и намекнул, ну да ладно...
2. Парсинг и процессинг документа, получение модели. Это ты тоже посчитал простым шагом.
3. Отображение модели. Трудность в этом? Как отобразить содержимое документа на экране? Или все же "принцип создания GUI" ?
Если нужен только принцип, то он прост: есть модель документа, обычно древовидная. При перерисовке узлу передается координаты области в которой он может рисоваться. Узел последовательно перебирает своих потомков, получая информацию об их размерах и заставляя их перерисовываться в конкретной области передавая им координаты. Как только очередной потомок не влазит, перебор прекращается и "наверх" отдается информация о занятой области из переданной вначале. И так до некоторых конечных элементов, которые обычно и выводятся на экран. Т.к. конечные элементы - это текст и простейшие контролы, то реализация их вывода проста (TextOut и т.п.)
Что тебе с <hr> не нравится? Ты же знаешь и разрешение экрана и размер окна, отсюда и считай проценты
Таблицы это интересно
Можно добавить еще один массив, только я не знаю как это согласовать с другими компонентами
З.Ы: попробуй поместить этот вопрос в "Общие вопросы"
Лучше бы кусок файерфокса выслали или ссылку путёвую дали по IWebBrowser2 - я пока нашел только всякий хлам, зато трафика извел немеряно...
IWebBrowser2 - должен быть интерфейсом к движку IE, если правильно понимаю. Следовательно, должен быть описан в MSDN. Тебе же, похоже, хочется реализовать движок рендеринга HTML самому.
Мне пока видится два пути, оба нереальные: исходники компонентов HtmlLite и Бата. ;)
Обзор исходников. Отсюда ты можешь понять, что именно тебе надо скачать:
http://www.mozilla.org/docs/source-directories-overview.html
Документация по Layout Engine:
http://www.mozilla.org/newlayout/doc/
Что такое Layout Engine можно понять из FAQ:
http://www.mozilla.org/newlayout/faq.html
Жизненный цикл HTML-документа в броузере:
http://www.mozilla.org/docs/url_load.html
Это COM интерфейс MS IE.
Его можно встроить в своё приложение.
Угу. Спасибчики. Я тут еще кое-что порыл, и решил что мне видимо нужен пока именно он.
Ну я же не телепат...
С кем не бывает ;)
Хм... Думаю будет сложновато понять без компиляции всего проекта.
Ладно, тогда - ну их в баню. Вопрос заданный из праздного любопытства - под какую среду исходники файра?
Хочешь получить конкретный ответ - задавай конкретный вопрос.
На тот момент конкретнее задать не мог. Сейчас кое в чем разобрался. Кстати, обратите внимание: в предыдущем посте я ни чуть не добавил конкретности к своему вопросу, за то вы ответили более конкретно...
Сути проекта я, действительно, не знаю, т.к. ты не потрудился объяснить.
Не могу - низя! :) Как бы это не совсем мое...
Как я представляю процесс предоставления обычной HTML-страницы можно разбить на след этапы:
1. Получение документа по запросу. Это не так просто, как тебе кажется, о чем я собственно и намекнул, ну да ладно...
Сталкивался с этим, получалось. Может конечно это и не совсем просто, но я знаю как с этим работать и где и что рыть - информации полным полно. Когда у меня есть такие данные, то проблема уже не проблема - она превращается в некоторый промежуток времени которое надо на нее затратить.
2. Парсинг и процессинг документа, получение модели.
Тут конечно уже сложнее, но т.к. на данном моменте не предпологается обработка сложных документов, то как-нибудь разберусь.
3. Отображение модели. Трудность в этом? Как отобразить содержимое документа на экране? Или все же "принцип создания GUI" ?
Если нужен только принцип, то он прост: есть модель документа, обычно древовидная...
Вот это уже по существу. Теперь действительно спасибо.
После этого всего, я понял что в действительности мне нужно! Еще раз спасибо Green'у :D Самопальный браузер из апей - это не цель. Он нужен лишь как окно отображения. Я написал это в заголовок темы т.к. не знал других путей, можно сказть: загнул по незнанию от динозавров. Для начала обойдемся IWebBrowser2.
Теперь конкертный вопрос: как с этим штуком работать на API? Есть где-нибудь нормальная инфа?
Я пока нашел - это [url=http://msdn.microsoft.com/workshop/browser/webbrowser/reference/ifaces/iwebbrowser2/iwebbrowser2.asp]MSDN[url] и все что лежит рядом. Есть еще что-нибудь дельное? В принципе - там все понятно вроде, только пока еще не нашел один важный момент: каким образом можно его встроить в собственное приложение при помощи исключительно API? Ищем-с...
Буду очень благодарен за исходник или дельную ссылку по данному вопросу.
каким образом можно его встроить в собственное приложение при помощи исключительно API?
Это уже классическое программирование COM/ActiveX. CoCreateInstance, CreateOleObject... Ой, кажется, последнее уже из Дельфи/Билдера. Кстати, можешь посмотреть, как непосредственно там реализовано.
Вот ссылки, которые мне показались информативными при разбирательстве с firefox:
Спасибо, но как выясняется (:)) мне нужно другое.
Извиняюсь за тормоза с ответами: GPRS - очень загадочная вещь. Предыдущий пост отправлял минут 20 после чего вообще не мог загрузить ни одну страницу с коденета! Какой-то бред.
IWebBrowser2 - должен быть интерфейсом к движку IE, если правильно понимаю. Следовательно, должен быть описан в MSDN.
Должен, да не обязан. Уже смотрел. Нема.
Спасибо, но как выясняется (:)) мне нужно другое.
Извиняюсь за тормоза с ответами: GPRS - очень загадочная вещь. Предыдущий пост отправлял минут 20 после чего вообще не мог загрузить ни одну страницу с коденета! Какой-то бред.
Должен, да не обязан. Уже смотрел. Нема.
У меня за апрель 2003 есть IWebBrowser2 Interface в MSDN c полным описанием его членов. Может у тя старый MSDN,хотя этот интерфейс поддерживается еще с 95 винды.
Должен, да не обязан. Уже смотрел. Нема.
Гы. У меня IWebBrowser2 описан в SHDocVw.pas. Следовательно, где-то должен быть и в Билдере. Или не про Билдер речь?
Ок, сегодня вечером выложу примерчик.
Жду с нетерпением.
Далее: просто чувствую себя действительно полным дятлом :( - не могу найти справку.
Freeman - делаю на VC++, но пользуюсь справочной системой от Билдера, т.к. в VC++ справки нет вообще. Билдер 6-ой версии. Где можно в нем посмотреть? Файла типа SHDoc* в директории Билдера нет, так же как и в Borland Shared/MSHelp (в этой папке поиск по содержанию ничего не дал). Может я не там ищу?
Как называется hlp-файл в котором есть описание IWebBrowser2?
Жду с нетерпением.
Вот обещанное.
Я сократил все до простоты примера, поэтому никакой стройности классов там нет... :D
Так же для простоты исключил код относящийся к ConnectionPoint. Это обратная связь эксплорера с приложением, т.е. приход различных событий, например об окончании загрузки документа и т.п. Думаю, пока тебе это не особо нужно.
Вот обещанное.
Я сократил все до простоты примера, поэтому никакой стройности классов там нет... :D
Так же для простоты исключил код относящийся к ConnectionPoint. Это обратная связь эксплорера с приложением, т.е. приход различных событий, например об окончании загрузки документа и т.п. Думаю, пока тебе это не особо нужно.
Спасибо, правда на данный момент все, что я понял, так это то, что без полноценного MSDN'а мне видимо не обойтись. Буду искать и покупать.
И я честно говоря - нифига не соображаю в классах, только основы. Вроде всё ясно, да не всё. Короче надо разбираться.
Теперь вопрос: нужно сделать так, что бы это експлореровское окно вместо того, что бы сразу загружать файл из инета перед этим отсылала сообщение главному окну и только после этого загружала файл который определит мое приложение. Как такое сделать не спрашиваю - постараюсь сам разобраться, главное: можно ли это сделать через стандартный интерфейс IWebBrowser2? Если нельзя, то в какую сторону смотреть что бы сделать это самому?
Спасибо, правда на данный момент все, что я понял, так это то, что без полноценного MSDN'а мне видимо не обойтись. Буду искать и покупать.
И я честно говоря - нифига не соображаю в классах, только основы. Вроде всё ясно, да не всё. Короче надо разбираться.
Теперь вопрос: нужно сделать так, что бы это експлореровское окно вместо того, что бы сразу загружать файл из инета перед этим отсылала сообщение главному окну и только после этого загружала файл который определит мое приложение. Как такое сделать не спрашиваю - постараюсь сам разобраться, главное: можно ли это сделать через стандартный интерфейс IWebBrowser2? Если нельзя, то в какую сторону смотреть что бы сделать это самому?
Чет не въеду в чем проблема,если ты имееш ввиду что после вызова метода pWeb->Navigate(L"http://rambler.ru", NULL, NULL, NULL, NULL); у тебя появляется эксплореровское окно то пошли перед вызовом данного метода к примеру SendMessage(your_hwnd,your_msg....
Если конечно это то что ты имел ввиду.
Спасибо, правда на данный момент все, что я понял, так это то, что без полноценного MSDN'а мне видимо не обойтись. Буду искать и покупать.
И я честно говоря - нифига не соображаю в классах, только основы. Вроде всё ясно, да не всё. Короче надо разбираться.
Теперь вопрос: нужно сделать так, что бы это експлореровское окно вместо того, что бы сразу загружать файл из инета перед этим отсылала сообщение главному окну и только после этого загружала файл который определит мое приложение. Как такое сделать не спрашиваю - постараюсь сам разобраться, главное: можно ли это сделать через стандартный интерфейс IWebBrowser2? Если нельзя, то в какую сторону смотреть что бы сделать это самому?
Green вроде сказал что он убрал из исходников сообщения IE -> Приложение
Наверняка тебе это и нужно
Вообще нужен MSDN ))
Я тоже чего-то не понял сути вопроса.
Понятно, действительно коряво спросил. Может счаз получится лучше.
Дубль 2: например щелкаем на сылке с загруженной страницы (rambler.ru), эксплореровский объект отсылает сообщение с указателем на строку ссылки (например ya.ru) в главное окно. Главное окно получив ссылку принимает какое-то свое решение и уже в зависимости от этого либо дает добро на загрузку ya.ru, либо указывает загрузить что-то другое. В моем случае подмена загружаемой страницы должна происходить либо на кешированную на диске, либо вообще на какую-то функцию прилжения. В последнем случае - понятно загружаться вообще ничего не должно.
Так можно сделать стандартными методами, или нужно шаманить?
Понятно, действительно коряво спросил. Может счаз получится лучше.
Дубль 2: например щелкаем на сылке с загруженной страницы (rambler.ru), эксплореровский объект отсылает сообщение с указателем на строку ссылки (например ya.ru) в главное окно. Главное окно получив ссылку принимает какое-то свое решение и уже в зависимости от этого либо дает добро на загрузку ya.ru, либо указывает загрузить что-то другое. В моем случае подмена загружаемой страницы должна происходить либо на кешированную на диске, либо вообще на какую-то функцию прилжения. В последнем случае - понятно загружаться вообще ничего не должно.
Так можно сделать стандартными методами, или нужно шаманить?
Все-таки прочитай мой ответ
Так можно сделать стандартными методами, или нужно шаманить?
Нужна точка сборки (Connection Point).
Будет время выложу пример... :)
Нужна точка сборки (Connection Point).
Будет время выложу пример... :)
Ясно, что пока ничего не понятно. Ладно, пока как раз наведу порядок в голове - надо с тем, что уже есть разобраться для начала.
Буду ждать, спасибо.
Все было бы значительно проще, если бы ты юзал ATL.
Собственно вот.
Все было бы значительно проще, если бы ты юзал ATL.
Спасибо, будем разбирать.
Все было бы значительно проще, если бы я имел хоть какое-то представление об ATL.
Green про IUnknown я много чего нашел, а вот про CContainer... - что это за зверь? Я так понял, что он определяется программистом и в принципе можно сделать без него, только это будет, скажем так, коряво. Верно?
Green про IUnknown я много чего нашел, а вот про CContainer... - что это за зверь? Я так понял, что он определяется программистом и в принципе можно сделать без него, только это будет, скажем так, коряво. Верно?
Ага, можно и без него. И хотя сам по себе он и так корявый (сейчас я бы сделал красивее), но без него будет ещё корявее.
Вот обещанное.
Я сократил все до простоты примера, поэтому никакой стройности классов там нет... :D
Так же для простоты исключил код относящийся к ConnectionPoint. Это обратная связь эксплорера с приложением, т.е. приход различных событий, например об окончании загрузки документа и т.п. Думаю, пока тебе это не особо нужно.
Подскажите пожалуйста как мне видоизменить данный код чтобы я мог в нем перехватывать событие OnBeforeNavigate используя те же WinAPI.
2All. Просьба чтоб не было ни каких ATL и иже с ним.
Подскажите пожалуйста как мне видоизменить данный код чтобы я мог в нем перехватывать событие OnBeforeNavigate используя те же WinAPI.
2All. Просьба чтоб не было ни каких ATL и иже с ним.
Тебе же исходник дали там все есть. Если отменить навигацию, то нужно:
1. Остановить навигацию m_pWebBrowser2->Stop();
2. Установить Cancel flag в TRUE ((*pDispParams).rgvarg)[0].boolVal = TRUE;
//вот дернул у себя, но у меня на Билдере
case DISPID_BEFORENAVIGATE2:
url = WideString(pDispParams->rgvarg[5].pvarVal->bstrVal);
if (url == WideString("http://intra2.laes.ru/stat/stat.htm"))
{
m_pWebBrowser2->Stop();
CComBSTR newURL = "Lres://webhost.exe/nonavigate.htm";
m_pWebBrowser2->Navigate(newURL, NULL, NULL, NULL, NULL);
((*pDispParams).rgvarg)[0].boolVal = TRUE;
}
...
Жду с нетерпением.
Далее: просто чувствую себя действительно полным дятлом :( - не могу найти справку.
Freeman - делаю на VC++, но пользуюсь справочной системой от Билдера, т.к. в VC++ справки нет вообще. Билдер 6-ой версии. Где можно в нем посмотреть? Файла типа SHDoc* в директории Билдера нет, так же как и в Borland Shared/MSHelp (в этой папке поиск по содержанию ничего не дал). Может я не там ищу?
Как называется hlp-файл в котором есть описание IWebBrowser2?
Это компонент TCppWebBrowser, TCppWebBrowser::ControlInterface. Кидаешь на форму и работай.
Это компонент TCppWebBrowser, TCppWebBrowser::ControlInterface. Кидаешь на форму и работай.
См. выше, дело было в VC++ при чем на API. Какой там нафиг TCppWebBrowser?
См. выше, дело было в VC++ при чем на API. Какой там нафиг TCppWebBrowser?
Ой сбило с толку: - "...делаю на VC++, но пользуюсь справочной системой от Билдера...". Фантастика!
Ой сбило с толку: - "...делаю на VC++, но пользуюсь справочной системой от Билдера...". Фантастика!
:) Ага, просто тогда у меня ничего более подходящего не было. Щас благо эта проблема снята.