Управление Directx в плагине для браузера

Мне нужно вставить элемент управления DirectX в подключаемый модуль Firebreath для браузера. Может ли кто-нибудь опубликовать образец, как это сделать? Я не разбираюсь в плагинах...

10x


person gln    schedule 23.05.2011    source источник


Ответы (1)


У меня нет примера, который я мог бы вам привести, но я могу примерно сказать, что вам нужно сделать.

Во-первых, прочитайте это: http://colonelpanic.net/2010/11/firebreath-tips-drawing-on-windows/

Это даст вам общее представление о том, как работает рисование в FireBreath.

Во-первых, вы настраиваете все при обработке AttachedEvent.

  1. Создайте новый поток для обработки рисования (ваш рисунок DirectX не должен находиться в основном потоке)
  2. Получите HWND из объекта PluginWindowWin (приведите FB::PluginWindow* к FB::PluginWindowWin и вызовите получитьHWND())
  3. Инициализируйте DirectX во вторичном потоке с предоставленным HWND. Настройте некоторую форму цикла рендеринга и убедитесь, что вы можете отправлять ему команды из основного потока.
  4. Обрабатывайте RefreshEvent (приходит из WM_PAINT), отправляя каким-то образом сообщение в ваш поток рендеринга, чтобы он перерисовывался при запуске этого события.
  5. Убедитесь, что на DetachedEvent вы закрыли свой поток.

Вам нужно выполнить всю инициализацию, отрисовку и завершение работы DirectX в одном потоке. Все это должно происходить в потоке, который не является просто основным потоком (не используйте только таймеры), потому что в противном случае это испортит контекст рендеринга браузера в некоторых версиях Firefox - не знаю, почему.

Во всяком случае, надеюсь, что это поможет.

Редактировать: чтобы передать параметры в начало boost::thread, если это абстракция потоков, которую вы решили использовать, просто передайте ее в качестве параметра.

boost::thread t(&MyClass::someFunction, this, theHWND);

Это запустит поток. На самом деле вы, вероятно, захотите сделать поток переменной класса или чем-то еще, чтобы вы могли получить к нему доступ позже - помните, что вы хотите, чтобы поток останавливался во время обработки DetachedEvent. Для сообщений я бы, вероятно, использовал FB::SafeQueue, которая является потокобезопасной очередью, являющейся частью FireBreath. Посмотрите в источниках, как его использовать; это довольно просто (я думаю, украдено из статьи codeproject).

// Inside MyClass
void someFunction(HWND theHWND) {
    ...
}
person taxilian    schedule 23.05.2011
comment
10 раз! что помогает. Можете ли вы привести пример рисования простой картинки? - person gln; 25.05.2011
comment
Вы хотите использовать Boost::thread? Как передать HWND в качестве параметра? Должен ли я создавать класс-оболочку? - person gln; 25.05.2011
comment
Вы можете использовать любую абстракцию потока, которую хотите. Вам не нужен класс-оболочка с boost::thread. Изучение того, как правильно использовать boost::thread, действительно выходит за рамки этого вопроса; есть много доступных примеров. Я обновил свой ответ, включив в него грубый пример. У меня нет каких-либо примеров, которые я мог бы вам привести, но если вы проделаете домашнюю работу и попробуете некоторые вещи, это должно вас заинтересовать. - person taxilian; 26.05.2011