問題為:背景界面是一個OpenGL窗口(對話框),在其上彈出一個OpenGL窗口(模態對話框)時,
1.上方的OpenGL窗口能響應鼠標操作等並刷新;
2.當移動或放大縮小上方的OpenGL窗口時,其中的模型就不會響應鼠標操作。
因為之前的程序是單對話框的,所以放大、移動等沒有問題,現在變成多OpenGL窗口顯示就出現問題了。網上查詢得知,OpenGL 繪圖的機制是:先用 OpenGL 的繪圖上下文 Rendering Context (簡稱為 RC )把圖畫好,再把所繪結果通過 SwapBuffer() 函數傳給 Window 的繪圖上下文 Device Context (簡記為 DC)。在程序運行過程中,可以有多個 DC,但只能有一個 RC,因此當一個 DC 畫完圖后,要立即釋放 RC,以便其它的 DC 也使用。
按照這個思路,在上面的虛擬仿真OpenGL窗口的OnPaint函數中加入一句代碼:
wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC );
其函數原型為
BOOL wglMakeCurrent(
HDC hdc, // device context of device that OpenGL calls are
// to be drawn on
HGLRC hglrc // OpenGL rendering context to be made the calling
// thread's current rendering context
);
wglMakeCurrent 函數設定OpenGL當前線程的渲染環境,以后這個線程所有的OpenGL調用都是在這個hdc標識的設備上繪制。可以使用wglMakeCurrent 函數來改變調用線程的當前渲染環境,使之不再是當前的渲染環境。一個線程只可以有一個渲染環境。所以一個多線程進程可以有多個渲染環境。一個線程在調用任何OpenGL函數之前必須設置一個當前渲染環境。否則所有OpenGL調用都將忽略。在某一時刻渲染環境只能屬於一個線程,你不能使一個渲染環境同時屬於多個線程。一個應用程序可以通過不同線程中的不同的當前渲染環境產生多個繪圖,它支持各個線程都擁有自己的渲染環境的設備環境。
由於我的問題僅限於一個模態對話框和背景對話框兩個窗口的RC沖突,所以沒有采用多線程來實現,只是將當前線程的RC對應到了不同的DC上。考慮,如果用非模態對話框實現三維場景的話,就需要另開一個線程。
此時,問題還沒有完全解決,虛擬模型窗口還是不能隨着鼠標移動。但是發現當刷新窗口時,模型就會改變,看來是響應了鼠標操作了,只是沒有刷新而已。於是乎,在onmousemove函數中加入了Invalidate(FALSE)函數,問題解決!