Directx контроль в плагине браузера - PullRequest
0 голосов
/ 23 мая 2011

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

10x

1 Ответ

2 голосов
/ 24 мая 2011

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

Сначала прочитайте это: http://colonelpanic.net/2010/11/firebreath-tips-drawing-on-windows/

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

Сначала вы настраиваете все при обработке AttachedEvent.

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

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

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

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

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

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

// Inside MyClass
void someFunction(HWND theHWND) {
    ...
}
...