opengl mfc 靜態拆分視窗

2021-05-27 22:08:03 字數 1871 閱讀 4761

參考

第一:對函式wglmakecurrent有乙個新的認識。

使指定的顏色上下文(rendering context)成為當前執行緒正呼叫的地顏色上下文(rendering context)。在該執行緒中的所有opengl呼叫命令都將被畫在被指定的hdc上。所以,你可以使用wglmakecurrent來改變當前執行緒呼叫的顏色上下文(rendering context),也可以使用它來改變執行緒對應的裝置上下文(hdc)。

使用動態分割視窗。不可以,因為,動態拆分視窗時,並沒建立多個cview類的實體,而只是建立了乙個例項,然後通過拆分及scroll bar的拖動達到對檢視的不同部位的現實。可以通過設定斷點來進行驗證。如:使用csplitterwnd的成員函式create建立多個拆分視窗後,在該行設定斷點逐行追蹤,觀察csplitterwnd的成員變數m_rows和m_ncols即可發現他們的值都是1,從而驗證了並沒有建立多個視窗例項。所以,當使用動態拆分視窗時,修改view類當對所有視窗產生修改,因此不能使用。

使用靜態分割視窗。其基本流程是:當更新乙個子視窗時,使用wglmakecurrent來把當前的顏色上下文與該子視窗的裝置上下文進行繫結,當改換跟新另乙個視窗時,再對新的視窗的裝置上下文與當前顏色上下文進行繫結。由於乙個執行緒只能有乙個顏色上下文(所以在單文件中不可以出現多個顏色上下文(rendering context),除非建立多執行緒。因此只能乙個用完之後另乙個用。(以上是個人理解,如有不對請指正)在靜態拆分視窗過程中根據需要可以建立多個view類或者使用乙個view類。在上論壇中使用了乙個view類。

第二:靜態視窗的建立

在cmainframe類中過載方法oncreateclient

bool cmainframe::oncreateclient(lpcreatestruct lpcs, ccreatecontext* pcontext)

p00 = (cview*) m_wndsplitter.getpane(0, 0);

p01 = (cview*) m_wndsplitter.getpane(0, 1);

p10 = (cview*) m_wndsplitter.getpane(1, 0);

p11 = (cview*) m_wndsplitter.getpane(1, 1);

m_wndsplitter.recalclayout();

return true;

}

其中p00,p01,p10,p11位全域性變數,在view類中有關鍵用處。

第三:view類中ondraw函式的修改

extern cview *p00, *p01, *p10, *p11;

void copengl13view::ondraw(cdc* pdc)

if(p01 == this)

if(p10 == this)

if(p11 == this)

pdoc->m_loadobj.draw();

//cdc* pdc = new cclientdc(this);

::swapbuffers(pdc->getsafehdc());

}

因為程式中並沒有要顯示新的資料,只是實現對原資料的不同角度的顯示,因此不必建立多個檢視類,當然也可以顯示多個3d模型只要建立多個檢視類的話。注意函式

wglmakecurrent(pdc->getsafehdc(), m_opengl.m_hrc);

實現切換對hdc與glhrc的對映關係。

MFC中靜態拆分視窗

一 範例執行結果 二 具體實現步驟步驟 1 建立2個視窗類cselectview和cdisplayview,到時候負責往上圖1和2的位置顯示東西。2 主視窗中定義乙個切分視窗類的物件,通過物件進行拆分 csplitterwnd m spliter 切分視窗類物件 3 重寫主視窗oncreatecli...

靜態拆分視窗 三叉視窗

1.首先在cmainfrm.h中定義2個csplitterwnd 的變數 csplitterwnd m wndsplitter1 csplitterwnd m wndsplitter2 2.新增你要載入的3個子視窗的類class wizard add class 新建基於cview的類cview1,...

建立拆分視窗

在mfc導航中 選擇了拆分視窗,但是執行時,還是單一視窗,這需要我們手動的過載函式oncreateclient lpcretestruct,ccreatecontext pcontext 來實現拆分,當然前提已經建立了基於cview的檢視 本例中為 cpathview 例項如下 首先在mainfrm...