Веб-браузер в DirectX окне
От: Cannol  
Дата: 12.07.19 04:34
Оценка:
Всем привет!

Киньте, пожалуйста, ссылкой на примеры C++ исходников:
Мне надо в существующем 3D приложении Win64 сделать как бы встроенный веббраузер. Очень простой — просто показ таблицы и/или картинки из HTML. Хендл окна имеется, туда и надо вывести страничку браузера.
Как это с минимумом усилий сделать?

Гуглил, пока не очень понятно, что лучще подойдёт.
Вот, например, пример на IWebBrowser2 (ссылка), очень простой, но вот там окно уже есть, и непонятно, как тот браузер вывести на другое, своё окно в DirectX.
Вот еще нагуглил Chromium Embedded Framework (ссылка), но он какой-то громоздкий ИМХО. Полноценный браузер не очень нужен.

Или может, есть решение лучше/проще, чем веббраузер? Буду рад любым идеям.

------------------------------------------
И не отходя от кассы:
Еще надо сделать внутри этого приложения как бы дисплей бортового компьютера.
На экране преимущественно будет текстовая информация в таблице размером MxN, плюс немного линий. Примерно как на этой картинке: ссылка
Вопрос в том, как оптимальнее использовать здесь D2D, опыта в нём у меня почти не было. Знаю, что есть всякие примитивы, типа CRenderTarget::DrawText(),CRenderTarget::DrawLine(), и даже использовал в мелкой задаче ранее. Но вот для этой вот задачи ИМХО такой подход слишком кропотлив. Как бы сберечь время?
Или может, есть какая-нибудь надстройка над D2D, или готовые примеры с сорцами?
Спасибо.
Re: Веб-браузер в DirectX окне
От: swame  
Дата: 13.07.19 11:52
Оценка: 3 (1)
Здравствуйте, Cannol, Вы писали:

C>Всем привет!


C>Киньте, пожалуйста, ссылкой на примеры C++ исходников:

C>Мне надо в существующем 3D приложении Win64 сделать как бы встроенный веббраузер. Очень простой — просто показ таблицы и/или картинки из HTML. Хендл окна имеется, туда и надо вывести страничку браузера.
C>Как это с минимумом усилий сделать?

C>И не отходя от кассы:

C>Еще надо сделать внутри этого приложения как бы дисплей бортового компьютера.
C>На экране преимущественно будет текстовая информация в таблице размером MxN, плюс немного линий. Примерно как на этой картинке:

Интерактивности в обоих случая видимо не требуется,
в обоих случая рендерить картинку во внешнем не 3D окне любым доступным способом,
снимать битмапку и передавать в 3D.
Re: Веб-браузер в DirectX окне
От: LuciferSaratov Россия  
Дата: 13.07.19 12:22
Оценка: 3 (1)
Здравствуйте, Cannol, Вы писали:

C>Всем привет!


если полноценного HTML не надо, то могу посоветовать рассмотреть librocket.
https://github.com/libRocket/libRocket
я ее использовал в паре проектов, делал на ней интерфейс меню игры.
наворотов в ней мало, но что есть, работает хорошо.
табличку уж точно покажет.
Re[2]: Веб-браузер в DirectX окне
От: Cannol  
Дата: 14.07.19 09:38
Оценка:
S>Интерактивности в обоих случая видимо не требуется,
S>в обоих случая рендерить картинку во внешнем не 3D окне любым доступным способом,
S>снимать битмапку и передавать в 3D.

Спасибо большое!
Да, интерактивность минимальная: для "браузера" только обрабатывать клики типа ПредыдущаяСтраница/СледующаяСтраница, и менять страницу соответственно (подсовывать другой HTM файл);
для "дисплея" тоже обрабатывать клики для изменения страницы.

> рендерить картинку во внешнем не 3D окне любым доступным способом,

> снимать битмапку и передавать в 3D.
Для "браузера" логично, спасибо! Вероятно, мне надо копать на предмет создать новое 2Д окно неотображаемым (?), туда выводить работу браузера, как-то сграбить содержимое этого скрытого окна (нагуглил щас стандартную функцию PrintWindow()), и уже в DirectX окно отправлять тот сграбленный Bitmap.
Прошу поправить, если где-то ошибся.

А для "дисплея" не понял, зачем тут тоже надо рендерить картинку во внешнем не 3D окне и снимать битмапку?
Если сразу рисовать там же в 3D (DrawText/DrawLine()), будет неоптимально или что-то другое имелось в виду?
Отредактировано 14.07.2019 9:42 Cannol . Предыдущая версия .
Re[2]: Веб-браузер в DirectX окне
От: Cannol  
Дата: 14.07.19 09:42
Оценка:
LS>если полноценного HTML не надо, то могу посоветовать рассмотреть librocket.
LS>https://github.com/libRocket/libRocket
LS>я ее использовал в паре проектов, делал на ней интерфейс меню игры.
LS>наворотов в ней мало, но что есть, работает хорошо.
LS>табличку уж точно покажет.

Да, HTML нужен очень простой — текст в таблице и картинки (вероятно, PNG).
Звучит интересно, почитаю, что это такое.
Спасибо большое!
Re[3]: Веб-браузер в DirectX окне
От: Cannol  
Дата: 19.07.19 08:54
Оценка:
Здравствуйте, swame, Вы писали:
S>снимать битмапку и передавать в 3D.

Здравствуйте, LuciferSaratov, Вы писали:
LS>табличку уж точно покажет.

Итак, сделал, как упомянуто выше:

1. Создаю новое 2Д окно неотображаемым (SW_HIDE);

2. Туда вывожу работу браузера (вышеупомянутый простейший пример на IWebBrowser2);

3. Захватываю содержимое этого скрытого окна, используя PrintWindow(),
(При этом, когда SW_HIDE, получается просто чёрный экран. И пришлось, перед тем как сграбить, менять окно на SW_SHOWNORMAL, а потом сразу возвращать на SW_HIDE.)

4. Полученный Bitmap загружаю в DirectX окно: m_pRenderTarget->DrawBitmap();
И всё более-менее хорошо, спасибо!

Сейчас возникла другая проблема: а как реализовать мышиные клики от пользователя? Т.е. юзер кликает в том DirectX окне на страничку в браузере, а фактически всего лишь на Bitmap картинку от неё.
Как из этой DirectX-картинки переслать событие клика на само IWebBrowser2 окно ?
Думалось, что я просто определю координаты клика в DirectX окне, и направлю их в то скрытое окно браузера — небось какая-нибудь стандартная функция типа webBrowser2->Navigate(хPos, уPos), но увы, такой не нашлось.

Как тут проще сделать? Или таки придётся мучиться транслированием координат туда-сюда, SendInput(MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN) вызывать (или SetCursorPos/SendMessage?) ?
Есть подозрение, что там буду изобретать велосипед.
Re[4]: Веб-браузер в DirectX окне
От: flаt  
Дата: 06.08.19 09:13
Оценка: +1
Здравствуйте, Cannol, Вы писали:

C>Сейчас возникла другая проблема: а как реализовать мышиные клики от пользователя? Т.е. юзер кликает в том DirectX окне на страничку в браузере, а фактически всего лишь на Bitmap картинку от неё.


C>Есть подозрение, что там буду изобретать велосипед.


Sciter или какой другой движок для рендеринга HTML.
Re: Веб-браузер в DirectX окне
От: Cannol  
Дата: 12.08.19 03:35
Оценка:
Всем спасибо!

Если кому интересно станет в будущем, продолжение в другом разделе, более соответствующем вопросу:
ссылка
Re: Веб-браузер в DirectX окне
От: c-smile Канада http://terrainformatica.com
Дата: 31.08.19 03:08
Оценка:
Здравствуйте, Cannol, Вы писали:

C>Всем привет!


C>Киньте, пожалуйста, ссылкой на примеры C++ исходников:

C>Мне надо в существующем 3D приложении Win64 сделать как бы встроенный веббраузер. Очень простой — просто показ таблицы и/или картинки из HTML. Хендл окна имеется, туда и надо вывести страничку браузера.
C>Как это с минимумом усилий сделать?

Sciter : https://sciter.com/sciter-and-directx/

И есть также

BOOL SCAPI SciterRenderOnDirectXTexture(HWINDOW hwnd, HELEMENT elementToRenderOrNull, IUnknown* surface);


https://github.com/c-smile/sciter-sdk/blob/master/include/sciter-x-def.h#L526
Re[2]: Веб-браузер в DirectX окне
От: Cannol  
Дата: 02.09.19 22:01
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:
LS>если полноценного HTML не надо, то могу посоветовать рассмотреть librocket.
LS>https://github.com/libRocket/libRocket
LS>я ее использовал в паре проектов, делал на ней интерфейс меню игры.

Привет!
Увы, я пришёл к выводу, что это скорее для GUI нужно. Мне полноценного HTML браузера и не надо, но тут используется RML (похожий на HTML), и похоже, что только локально.
Т.е. вызовы только вида
LoadDocument("../../assets/demo.rml");

, а не "http://***".

Пробовал взять разные HTML файлы и тупо переименовать в RML и подсунуть, но таки не отображает. Встроенный Logger ругается много на что.
Ссылки на удалённые ресурсы тоже конвертит во что-то локальное.



Здравствуйте, c-smile, Вы писали:
CS>Sciter : https://sciter.com/sciter-and-directx/
CS>https://github.com/c-smile/sciter-sdk/blob/master/include/sciter-x-def.h#L526

Здравствуйте и спасибо! Я как раз изучал ваш проект чуть ранее и понял, что технически он как раз подходит!
Но увы, руководство не готово выделить средства для ENTERPRISE лицензии. (Вроде как мы не можем пользоваться более дешёвой лицензией — у нас более 20 человек.)
Re: Веб-браузер в DirectX окне
От: nen777w  
Дата: 05.09.19 13:11
Оценка: +1
Видел что CEF используется например в Second Life. Он правда на OpenGL, но сути это не меняет. Отдаешь в CEF на отрисовку память, потом рендеришь как текстуру.
Отредактировано 05.09.2019 13:12 nen777w . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.