CSplitterWnd類(lèi)
MFC中的分割窗口類(lèi)-CSplitterWnd類(lèi)封裝分割器窗口的所有功能。分割器窗口指含有多個(gè)窗格的窗口,多窗口可以容納相同的視圖或不同的視圖。
1.構造對象
CSplitterWnd類(lèi)首先構造對象,在VS2010軟件自動(dòng)搭建的構架內部,分拆窗口的實(shí)現在CMainFrame主框架中實(shí)現,在主框架的類(lèi)的定義中定義一個(gè)公有(public) CSplitterWnd對象,供BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)函數調用,實(shí)現窗口分拆的目的。
2.靜態(tài)創(chuàng )建與動(dòng)態(tài)創(chuàng )建
動(dòng)態(tài)創(chuàng )建函數CSplitterWnd類(lèi)有一個(gè)Create()函數,用于創(chuàng )建動(dòng)態(tài)分割器窗口并將該窗口鏈接到CSplitterWnd類(lèi)對象。
靜態(tài)創(chuàng )建函數CSplitterWnd類(lèi)有一個(gè)CreateStatic()函數,用于創(chuàng )建動(dòng)態(tài)分割器窗口并將該窗口鏈接到CSplitterWnd類(lèi)對象。
2)在父框架類(lèi)中定義一個(gè)CSplitterWnd類(lèi)型的成員對象。
3)重載父框架類(lèi)的CFrameWnd::OnCreateClient成員函數。
4)在重載的CFrameWnd::OnCreateClient函數中調用CSplitterWnd成員對象的Create函數。
案例代碼: 注:這里m_splitterwnd為 CSplitterWnd類(lèi)對象。
// CMainFrame 消息處理程序 處理分拆窗口
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加專(zhuān)用代碼和/或調用基類(lèi)
m_splitterwnd.CreateStatic(this,1,2);//拆分靜態(tài)窗口為一行兩列
m_splitterwnd.CreateView(0,0,RUNTIME_CLASS(CMyDaohangView),CSize(250,100),pContext);
m_splitterwnd.CreateView(0,1,RUNTIME_CLASS(CoilpumpspecialistView),CSize(100,100),pContext);
return TRUE;
}
二 關(guān)于分拆窗口中的視構建
1)客戶(hù)區概念
a)先學(xué)習一下OnCreateClient這個(gè)函數:
CFrameWnd::OnCreateClient調用由框架在 OnCreate時(shí)的執行。
語(yǔ)法
virtual BOOL OnCreateClient(
LPCREATESTRUCT lpcs,
CCreateContext* pContext );
參數:
lpcs
對于Windows CREATESTRUCT 結構的指針。
pContext
為 CCreateContext 結構的指針。
返回值:如果成功,非零;否則為0。
備注:
不要調用此函數。
此函數的盡可能默認實(shí)現在 pContext創(chuàng )建從已提供的信息 CView 對象。
重寫(xiě)此函數重寫(xiě)在 CCreateContext 對象傳遞的值或更改方法控制在框架窗口的主要客戶(hù)端區域中創(chuàng )建。 您可以重寫(xiě)的 CCreateContext 成員。CCreateContext 選件類(lèi)所述。
System_CAPS_note注意
不要替換在 CREATESTRUCT 結構中傳遞的值。 它們僅適用于信息性使用。 例如,如果要重寫(xiě)初始窗口矩形重寫(xiě) CWnd 成員函數 PreCreateWindow。
要求:頭文件位置: afxwin.h,請參閱CFrameWnd Class層次結構圖
2) 理解客戶(hù)區
客戶(hù)區分為窗口框架客戶(hù)區和視圖客戶(hù)區,窗口框架客戶(hù)區包容視圖;框架客戶(hù)區以外為框架非客戶(hù)區。這里為框架客戶(hù)區,在這個(gè)客戶(hù)區里可以構建視圖窗口,視圖視(窗口)內包含視圖客戶(hù)區,這里不討論。
在框架客戶(hù)區內部構造分拆器,說(shuō)明一個(gè)根本的目的就是要分拆框架窗口的客戶(hù)區,讓不同的視放入不同的框架客戶(hù)區內部。
三)建立視
1)讓我們看看嵌入OnCreateClient()中的下面代碼:
m_splitterwnd.CreateView(0,0,RUNTIME_CLASS(CMyDaohangView),CSize(250,100),pContext);
調用了如下構建函數:
CCreateContext 結構CCreateContext 結構,在創(chuàng )建與文檔框架窗口和視圖時(shí)。struct CCreateContext
CCreateContext 是結構,并沒(méi)有基類(lèi)。
在創(chuàng )建窗口時(shí),此結構的值中的信息連接文檔的元素到其數據視圖。 如果重寫(xiě)創(chuàng )建過(guò)程中,您只需 CCreateContext。
CCreateContext 結構包含指向文檔、框架窗口、視圖和文檔模板。 它還包含標識視圖的類(lèi)型創(chuàng )建的指向 CRuntimeClass。 運行時(shí)選件類(lèi)信息和當前文件指針使用動(dòng)態(tài)創(chuàng )建新視圖。 下表建議如何以及何時(shí)可以使用每個(gè) CCreateContext 成員:
| 成員 | 類(lèi)型 | 將針對 |
|---|---|---|
m_pNewViewClass | CRuntimeClass* | 創(chuàng )建的新視圖的CRuntimeClass。 |
m_pCurrentDoc | CDocument* | 現有文檔與新的視圖。 |
m_pNewDocTemplate | CDocTemplate* | 文檔模板與新的MDI框架窗口的創(chuàng )建。 |
m_pLastView | CView* | 附加視圖進(jìn)行建模的原始視圖中,在拆分窗口視圖中創(chuàng )建或第二個(gè)視圖的創(chuàng )建文檔中的。 |
m_pCurrentFrame | CFrameWnd* | 其他框架窗口進(jìn)行建模的框架窗口,在第二個(gè)框架窗口中創(chuàng )建文檔中的。 |
當文檔模板創(chuàng )建文檔及其關(guān)聯(lián)的元素時(shí),它將驗證 CCreateContext 結構中存儲的信息。 例如,不應使用不存在創(chuàng )建視圖文檔。
![]() |
|---|
所有在 |
功能下面列出的“并查看的成員使用CCreateContext ”。如果您計劃中重寫(xiě)這些屬性,請參考這些函數的聲明特定的信息。
這是一些通用準則:
當通過(guò),因為windows創(chuàng )建的參數,在 CWnd::Create,CFrameWnd::Create和 CFrameWnd::LoadFrame,創(chuàng )建上下文指定應連接的窗口。 對于大多數窗口,整個(gè)結構是可選的,并且 NULL 指針可以通過(guò)。
對于可重寫(xiě)的成員函數,例如 CFrameWnd::OnCreateClient,CCreateContext 參數是可選的。
對于視圖創(chuàng )建涉及的成員函數時(shí),必須提供足夠的信息來(lái)創(chuàng )建視圖。 例如,在拆分窗口的第一個(gè)視圖,必須提供視圖選件類(lèi)信息,并且當前文件。
通常,因此,如果使用框架默認,您可以忽略 CCreateContext。 如果嘗試更高級的修改,Microsoft基礎類(lèi)庫選件源代碼或示例程序,例如VIEWEX中,將引導您完成。 如果忘記一個(gè)必選參數,結構斷言將告知您要忘記了。
有關(guān) CCreateContext的更多信息,請參見(jiàn)MFC示例 VIEWEX。
要求 標頭: afxext.h
3)理解pContext
當我把
m_splitterwnd.CreateView(0,0,RUNTIME_CLASS(CMyDaohangView),CSize(250,100),pContext);里pContext指針設定為NULL編譯不能通過(guò),這個(gè)指針用于CreateView時(shí)指向創(chuàng )建描述表,這里可以檢查RUNTIME_CLASS(CMyDaohangView)是否建立,則CreateView返回布爾類(lèi)型校驗框架客戶(hù)區的視創(chuàng )建成功與否。聯(lián)系客服