浏览器插件中的Directx控件

时间:2011-05-23 12:19:55

标签: plugins directx firebreath

我必须将directx控件插入到浏览器的firebreath插件中。 任何人都可以发布样本怎么做?我对插件一无所知......

10倍

1 个答案:

答案 0 :(得分:2)

我没有一个可以给你的例子,但我可以大致告诉你你需要做什么。

首先,请阅读:http://colonelpanic.net/2010/11/firebreath-tips-drawing-on-windows/

这将为您提供有关绘图如何在FireBreath中工作的概述。

首先,在处理AttachedEvent时设置所有内容。

  1. 创建一个新线程来处理绘图(您的DirectX绘图不能在主线程上)
  2. 从PluginWindowWin对象获取HWND(将FB :: PluginWindow *强制转换为FB :: PluginWindowWin并调用getHWND()
  3. 使用提供的HWND在辅助线程上初始化DirectX。设置某种形式的渲染循环,并确保您可以从主线程发送命令。
  4. 通过以某种方式向您的渲染线程发布消息来处理RefreshEvent(来自WM_PAINT),以便在该事件被触发时重绘。
  5. 确保在DetachedEvent上关闭线程。
  6. 您需要在同一个线程上执行DirectX内容的所有初始化,绘制和关闭。这需要发生在一个不仅仅是主线程的线程上(不要只使用定时器),否则它会搞砸某些版本的Firefox上的浏览器渲染上下文 - 不知道为什么。

    无论如何,希望这有帮助。

    编辑:要将参数传递到boost :: thread的开头,如果你决定使用它的线程抽象,只需将其作为参数传递。

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

    那将启动线程。实际上,您可能希望将线程设置为类变量或其他内容以便以后可以访问它 - 请记住,在处理DetachedEvent期间,您将希望线程已停止。对于消息,我可能使用FB :: SafeQueue,它是一个线程安全队列,是FireBreath的一部分。看看如何使用它的来源;它非常简单(我认为,从代码项目文章中窃取)。

    // Inside MyClass
    void someFunction(HWND theHWND) {
        ...
    }
    
相关问题