2015-01-14 3 views
1

У меня есть довольно сложная тема, которую я пытаюсь выяснить.DirectX, отскакивающий рендеринг directx от источника hwnd к новому целевому hwnd

В WPF/WinForms я могу создать компонент WebBrowser, который имеет существенные ограничения, они будут решительно разрешены/уменьшены, если я смогу отскочить поверхность directx от элемента управления веб-браузера до поверхности DirectX, которую у меня установлена.

Несколько вещей отметить:

  1. Компонент WebBrowser принимает компонент IWebBrowser2 OLE/ActiveX в окне «плавающим» выше существующего контента в качестве дочернего окна окна WPF.

  2. Я знаю и могу получить (без хаков) HWND плавающего окна; и подклассифицированные HWND для детей, у которых есть действующий компонент Internet Explorer.

  3. Я могу подтвердить, что окно рендеринга с directX, но у меня нет никаких дескрипторов для чего-либо вне HWND. Я не знаю поверхности, на которой он был сделан, устройство или что-то еще.

То, что я нашел в качестве потенциальных решений:

  1. BitBlt дочернего окна на поверхность WPF, чтобы решить эту проблему; это вариант последней инстанции, поскольку для захвата потребуется таймер и обновление растрового изображения. Это кажется расточительным и, похоже, не так уж велико.

  2. Вариант «перенаправления» поверхности DirectX HWND был отмечен как «тривиальный» писателями Microsoft Blog, но они на самом деле не объясняют, как это сделать. Таким образом, может существовать метод non-directx non-gdi, который более высокоуровневый, который может работать, если кто-то знает об этом.

  3. Используйте цепочку подкачки, чтобы отскочить поверхность DirectX от источника WebBrowser HWND к новой цели. Это мой оптимальный выбор; но его трудно даже начать, так как у меня нет ничего, кроме HWND цели. (Я не ограничиваюсь WPF, другие технологии, такие как OLE/COM/MFC/ATL/WinForms, отлично!)

  4. Есть ли способ получить доступ к устройству directx из объекта OLE/COM? .. . Вид града женится, используя рефлексию/отладчики, я не могу найти никакой ссылки на него. Но это также несколько взломанно, поскольку я копаю глубоко внутри внутренних частей реализации.

Есть ли указатели, подсказка или направление любой может предоставить о том, как я мог бы лучше сделать это с минимальными «повозкой, запряженными волами» и максимальной производительностью?

ответ

1

Для начала я действительно не думаю, что вы можете заставить WebBrowser визуализировать непосредственно на вашей пользовательской поверхности DirectDraw. Тем не менее, вы можете обеспечить HDC на поверхности DD.

Если вы хотите поиграть с этим, элемент управления WebBrowser ActiveX реализует Windowless ActiveX Controls interfaces. Теоретически вы можете реализовать хост ActiveX без окон и использовать IViewObject::Draw для рисования на HDC поверхности DD. Я не могу предсказать, какова будет эффективность этого, но я сомневаюсь, что он даже близко приблизился к собственной производительности DirectDraw для механизма рендеринга Trident.

Я также разместил somewhat related code, который использует OleDraw (который косвенно вызывает IViewObject::Draw).

+1

Спасибо за помощь. Мне не удалось вникнуть в решение OleDraw/IViewObject :: Draw, но вы действительно дали мне довольно интересную идею. BitBlt/StretchBlt обе аппаратные ускоряются при использовании одних и тех же подарков и использовании DirectX DC. Я немного подумал, что было бы быстрее использовать идею BitBlt, которую я имел с GDI, но вместо этого с поверхностью DirectX она работает очень хорошо! Вы можете увидеть результаты здесь: https://gist.github.com/trevorlinton/293f8d3de742ed7054e4, в конечном счете, это не похоже на решение, которое не требует использования таймера: /. – Trevor

+0

@Trevor, относительно таймера, вы можете попробовать сыграть с 'IAdviseSink', который будет реализован хостом. Элемент управления должен вызывать, когда изменяется его представление. – Noseratio

+0

Я пробовал использовать IAdviseSink, однако, похоже, он не публикует больше, чем уведомление, когда элемент управления создан и уничтожен. Полагаю, я могу вникнуть в другие интерфейсы MSHTML и посмотреть, есть ли здесь что-то, что может быть экономичным. – Trevor

 Смежные вопросы

  • Нет связанных вопросов^_^