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