鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)
分割窗口概述
??????分割窗口,顧名思義,就是將一個(gè)窗口分割成多個(gè)窗格,在每個(gè)窗格中都包含有視圖,或者是同一類(lèi)型的視圖,或者是不同類(lèi)型的視圖。
? ???? MFC分割窗口的方式有兩種,動(dòng)態(tài)分割和靜態(tài)分割。
?????? 動(dòng)態(tài)分割窗口通常用于創(chuàng)建同一個(gè)文檔對(duì)應(yīng)的多個(gè)視圖,而且這些視圖一般都是同一類(lèi)型的視圖,能夠在用戶(hù)編輯文檔的不同部分時(shí)提供方便。
?????? 大家看下Word里的動(dòng)態(tài)分割窗口就很明白了,以Word 2007文檔為例,在菜單中點(diǎn)擊“視圖”->“拆分”,就可以看到一條隨鼠標(biāo)移動(dòng)的分隔條,當(dāng)我們?cè)谖臋n中某個(gè)位置按下鼠標(biāo)左鍵時(shí),分割條就固定了下來(lái),生成了上下兩個(gè)分割窗格,通過(guò)滾動(dòng)每個(gè)窗格中的垂直滾動(dòng)條可以看到,兩個(gè)窗格中的內(nèi)容相同,這就是所說(shuō)的對(duì)應(yīng)同一個(gè)文檔的同一類(lèi)視圖。
?????? 動(dòng)態(tài)分割窗口最多可以有兩行兩列。
?????? 靜態(tài)分割窗口比較常見(jiàn)。我們經(jīng)常能看到某個(gè)軟件打開(kāi)后,界面窗口默認(rèn)被分割成了幾個(gè)窗格,這就是靜態(tài)分割窗口。
?? ??? 靜態(tài)分割窗口指在窗口創(chuàng)建時(shí),分割的窗格就已經(jīng)生成了,而且用戶(hù)不能改變窗格的數(shù)量和順序。靜態(tài)分割窗口最多支持16行16列。通常靜態(tài)分割窗口的每個(gè)窗格中包含不同類(lèi)的視圖,當(dāng)然也可以是同一類(lèi)的視圖。
???????CSplitterWnd類(lèi)
??? ?? MFC中的分割窗口類(lèi)-CSplitterWnd類(lèi)提供了分割窗口的功能。CSplitterWnd類(lèi)中包含一個(gè)分割器窗口,該分割器窗口就是一個(gè)包含多個(gè)窗格的窗口。我們分割窗口時(shí)就是直接在此分割器窗口中分割的。
?? ??? 雞啄米下面介紹三個(gè)最常用的成員函數(shù):
C++代碼?????? 創(chuàng)建動(dòng)態(tài)分割窗口。參數(shù)pParentWnd為分割器窗口的父框架窗口;參數(shù)nMaxRows為分割器窗口的最大行數(shù),不能超過(guò)2;參數(shù)nMaxCols為分割器窗口的最大列數(shù),也不能超過(guò)2;參數(shù)sizeMin為窗格能顯示的最小尺寸,如果窗格尺寸小于sizeMin則不顯示;參數(shù)pContext為指向CCreateContext結(jié)構(gòu)的指針,大多數(shù)情況下可以賦值為父框架窗口的pContext;參數(shù)dwStyle指定窗口風(fēng)格;參數(shù)nID為分割窗口的ID,除非分割器窗口嵌入到另一個(gè)分割器窗口中,否則可以取值A(chǔ)FX_IDW_PANE_FIRST。
C++代碼??? ?? 創(chuàng)建靜態(tài)分割窗口。參數(shù)pParentWnd、dwStyle和nID同上;參數(shù)nRows為行數(shù),不能超過(guò)16;參數(shù)nCols為列數(shù),同樣不能超過(guò)16。
C++代碼?????? 為靜態(tài)分割窗口創(chuàng)建窗格視圖。參數(shù)row指定分割器窗口中放置新視圖的行;參數(shù)col指定放置新視圖的列;參數(shù)pViewClass指定新視圖的CRuntimeClass對(duì)象;參數(shù)sizeInit指定新視圖的初始大小;參數(shù)pContext為指向CCreateContext結(jié)構(gòu)的指針,通??梢再x值為傳遞給父框架窗口的重載函數(shù)CFrameWnd::OnCreateClient的pContext參數(shù)值。
???????動(dòng)態(tài)分割窗口
?????? 創(chuàng)建動(dòng)態(tài)分割窗口的步驟為:
?? ??? 1. 在父框架類(lèi)中定義一個(gè)CSplitterWnd類(lèi)型的成員對(duì)象。
?? ??? 2. 重載父框架類(lèi)的CFrameWnd::OnCreateClient成員函數(shù)。
?? ??? 3. 在重載的CFrameWnd::OnCreateClient函數(shù)中調(diào)用CSplitterWnd成員對(duì)象的Create函數(shù)。
?? ??? 下面雞啄米給大家一個(gè)實(shí)例。同樣以VS2010/MFC編程入門(mén)之三十四(菜單:VS2010菜單資源詳解)中創(chuàng)建Example34工程為例,我們要實(shí)現(xiàn)在主框架窗口的客戶(hù)區(qū)中創(chuàng)建兩行兩列的動(dòng)態(tài)分割窗口。以下是創(chuàng)建動(dòng)態(tài)分割窗口的具體步驟:
?? ??? 1. 在MainFrm.h文件中為CMainFrame類(lèi)添加成員對(duì)象:CSplitterWnd m_wndSplitter;。
??? ?? 2. 在Class View類(lèi)視圖中找到CMainFrame類(lèi),右鍵點(diǎn)擊,在右鍵菜單中選擇Properties,就會(huì)顯示屬性頁(yè),然后在屬性頁(yè)的工具欄上點(diǎn)擊Tip為Overrides的按鈕,下面的列表中就列出了能夠重載的函數(shù),找到OnCreateClient生成重載函數(shù)。
?? ??? 3. 在MainFrm.cpp文件中找到剛重載的OnCreateClient函數(shù)修改如下:
C++代碼?????? 4. 在Resource View資源視圖中,打開(kāi)Menu下的IDR_MAINFRAME菜單,在View下添加一個(gè)菜單項(xiàng),Caption設(shè)為Splitter Window,ID設(shè)為(一定要設(shè)為)ID_WINDOW_SPLIT。這樣在運(yùn)行結(jié)果界面中點(diǎn)擊此菜單項(xiàng)時(shí)MFC會(huì)執(zhí)行一些操作顯示動(dòng)態(tài)分割窗口。
?? ??? 5. 運(yùn)行程序,點(diǎn)擊菜單中的View->Splitter Window菜單項(xiàng),創(chuàng)建動(dòng)態(tài)分割窗口后效果如下:
?
???????靜態(tài)分割窗口
?? ??? 創(chuàng)建靜態(tài)分割窗口的步驟為:
?? ??? 1. 在父框架類(lèi)中定義一個(gè)CSplitterWnd類(lèi)型的成員對(duì)象。
?? ??? 2. 重載父框架類(lèi)的CFrameWnd::OnCreateClient成員函數(shù)。
?? ??? 3. 在重載的CFrameWnd::OnCreateClient函數(shù)中調(diào)用CSplitterWnd成員對(duì)象的CreateStatic成員函數(shù),然后可以調(diào)用CSplitterWnd成員對(duì)象的CreateView成員函數(shù)為每個(gè)窗格創(chuàng)建視圖。?
?? ??? 雞啄米仍通過(guò)Example34工程給大家一個(gè)實(shí)例,目的是在主框架窗口中的客戶(hù)區(qū)創(chuàng)建一個(gè)兩行一列的靜態(tài)分割窗口。如果已經(jīng)試驗(yàn)過(guò)動(dòng)態(tài)分割窗口的創(chuàng)建,那么麻煩撤銷(xiāo)那些修改吧。創(chuàng)建靜態(tài)分割窗口的具體步驟如下:
?? ??? 1. 在MainFrm.h文件中為CMainFrame類(lèi)添加成員對(duì)象:CSplitterWnd m_wndSplitter;。
?? ??? 2. 在Class View類(lèi)視圖中找到CMainFrame類(lèi),右鍵點(diǎn)擊,在右鍵菜單中選擇Properties,就會(huì)顯示屬性頁(yè),然后在屬性頁(yè)的工具欄上點(diǎn)擊Tip為Overrides的按鈕,下面的列表中就列出了能夠重載的函數(shù),找到OnCreateClient生成重載函數(shù)。
?? ??? 3. 在MainFrm.cpp文件中找到剛重載的OnCreateClient函數(shù)進(jìn)行修改。因?yàn)殡u啄米沒(méi)有新建其他視圖類(lèi),所以上下兩個(gè)窗格的視圖都是CExample34View。為了能識(shí)別CExample34View類(lèi),還需在MainFrm.cpp文件中添加#include "Example34View.h",在Example34View.h文件中添加#include "Example34Doc.h"。最終OnCreateClient函數(shù)修改如下:
C++代碼?????? 4. 運(yùn)行程序,在結(jié)果界面中關(guān)掉其他面板后效果如下:
?
?? ??? 如果大家想創(chuàng)建在其中某個(gè)窗格中再嵌套分割窗口,那么就需要再定義一個(gè)CSplitterWnd對(duì)象,以父窗格所在的CSplitterWnd對(duì)象為父框架窗口創(chuàng)建分割窗口即可。
?? ??? 分割窗口的內(nèi)容就講到這里了。雞啄米依然謝謝大家的支持。
轉(zhuǎn)載地址:http://www.jizhuomi.com/software/226.html轉(zhuǎn)載于:https://www.cnblogs.com/zfluo/p/5131885.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 鸡啄米vc++2010系列35(工具栏资
- 下一篇: MVC 登陆注册页面