0

我必须在浏览器的 firebreath 插件中插入一个 directx 控件。任何人都可以发布示例如何做到这一点?我对插件一无所知...

10倍

4

1 回答 1

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 上关闭线程。

您需要在同一个线程上执行 DirectX 的所有初始化、绘制和关闭操作。这一切都需要发生在一个不仅仅是主线程的线程上(不要只使用计时器),否则它会在某些版本的 Firefox 上搞乱浏览器渲染上下文——不知道为什么。

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

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

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

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

// Inside MyClass
void someFunction(HWND theHWND) {
    ...
}
于 2011-05-23T23:19:46.770 回答