2010-05-16 55 views
1

我在主窗口中使用OpenGL製作Win32應用程序(不使用GLUT)。 我現在在WM_PAINT中有我的繪圖代碼,當我調用swapBuffers時,它必須使自己失效,因爲它不斷重新渲染並使用大量的cpu資源。我怎樣才能讓它只有在使用GDI時誠實地接收WM_PAINT才能渲染?SwapBuffers導致重繪

謝謝

+1

建議你郵編... – 2010-05-16 02:04:57

回答

4

WM_PAINT消息持續發送,直到Windows驗證窗口的髒區域。重置髒區域的API是'EndPaint'。

調用SwapBuffers根本不應該影響無效的窗口區域。

你的WM_PAINT處理程序應該是這樣的:

case WM_PAINT: 
    HDC hdc; 
    PAINTSTRUCT ps; 
    hdc = BeginPaint(hwnd,&ps); 
    wglMakeCurrent(hdc,scene.m_oglContext); 
    scene.Render(); // 
    wglSwapBuffers(hdc); 
    wglMakeCurrent(hdc,0); 
    EndPaint(hwnd,&ps); 
    return 0; 

大量的示例代碼的Open GL編程具有在應用程序啓動一個HDC和OpenGL上下文設置。雖然它使示例代碼更簡單,但確實意味着代碼無法正確處理多個OpenGL上下文。此WM_PAINT處理程序假定爲場景創建了OpenGL上下文,然後根據需要設置爲當前。

根據需要交換OpenGL上下文的副作用是,從BeginPaint中檢索到的hdc用作呈現器(和SwapBuffer)目標,這意味着OpenGL應用程序現在將在同時拖動其他窗口時同時進行繪製應用程序的窗口。

1

我懷疑你不會從你的WM_PAINT處理程序返回0。這意味着WM_PAINT只是繼續生成。如果你返回0,那麼我相信,問題就會消失。

+0

請詳細說明一下嗎? – 2012-01-04 03:43:37

+0

@gry:從WM_PAINT返回0表示窗口已處理繪畫。如果你不返回0,那麼它將重新提交一個新的WM_PAINT到消息隊列的後面。 – Goz 2012-01-04 10:23:10