2011-05-23 215 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