2011-05-23 218 views

回答

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) { 
    ... 
} 
+0

10x!这有助于。你能提供一个简单图片的例子吗? – gln 2011-05-25 06:51:58

+0

你的意思是使用Boost ::线程吗?我如何通过HWND作为参数?我必须创建一个包装类吗? – gln 2011-05-25 10:46:01

+1

你可以使用任何你想要的线程抽象。你不需要boost :: thread的包装类。学习如何正确使用boost :: thread实际上超出了这个问题的范围。有很多例子可用。我已经更新了我的答案,以包含一个粗略的例子。我没有任何*我可以给你的例子,但是如果你做了一些功课并尝试一些应该让你去做的事情。 – taxilian 2011-05-26 05:35:51