|
上一節(jié)中雞啄米講了文檔、視圖和框架結(jié)構(gòu)中各對(duì)象之間的關(guān)系,本節(jié)主要講講在MFC中如何分割窗口。 分割窗口概述 分割窗口,顧名思義,就是將一個(gè)窗口分割成多個(gè)窗格,在每個(gè)窗格中都包含有視圖,或者是同一類型的視圖,或者是不同類型的視圖。 MFC分割窗口的方式有兩種,動(dòng)態(tài)分割和靜態(tài)分割。 動(dòng)態(tài)分割窗口通常用于創(chuàng)建同一個(gè)文檔對(duì)應(yīng)的多個(gè)視圖,而且這些視圖一般都是同一類型的視圖,能夠在用戶編輯文檔的不同部分時(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è)文檔的同一類視圖。 動(dòng)態(tài)分割窗口最多可以有兩行兩列。 靜態(tài)分割窗口比較常見。我們經(jīng)常能看到某個(gè)軟件打開后,界面窗口默認(rèn)被分割成了幾個(gè)窗格,這就是靜態(tài)分割窗口。 靜態(tài)分割窗口指在窗口創(chuàng)建時(shí),分割的窗格就已經(jīng)生成了,而且用戶不能改變窗格的數(shù)量和順序。靜態(tài)分割窗口最多支持16行16列。通常靜態(tài)分割窗口的每個(gè)窗格中包含不同類的視圖,當(dāng)然也可以是同一類的視圖。 CSplitterWnd類 MFC中的分割窗口類-CSplitterWnd類提供了分割窗口的功能。CSplitterWnd類中包含一個(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)的指針,通常可以賦值為傳遞給父框架窗口的重載函數(shù)CFrameWnd::OnCreateClient的pContext參數(shù)值。 動(dòng)態(tài)分割窗口 創(chuàng)建動(dòng)態(tài)分割窗口的步驟為: 1. 在父框架類中定義一個(gè)CSplitterWnd類型的成員對(duì)象。 2. 重載父框架類的CFrameWnd::OnCreateClient成員函數(shù)。 3. 在重載的CFrameWnd::OnCreateClient函數(shù)中調(diào)用CSplitterWnd成員對(duì)象的Create函數(shù)。 下面雞啄米給大家一個(gè)實(shí)例。同樣以VS2010/MFC編程入門之三十四(菜單:VS2010菜單資源詳解)中創(chuàng)建Example34工程為例,我們要實(shí)現(xiàn)在主框架窗口的客戶區(qū)中創(chuàng)建兩行兩列的動(dòng)態(tài)分割窗口。以下是創(chuàng)建動(dòng)態(tài)分割窗口的具體步驟: 1. 在MainFrm.h文件中為CMainFrame類添加成員對(duì)象:CSplitterWnd m_wndSplitter;。 2. 在Class View類視圖中找到CMainFrame類,右鍵點(diǎn)擊,在右鍵菜單中選擇Properties,就會(huì)顯示屬性頁(yè),然后在屬性頁(yè)的工具欄上點(diǎn)擊Tip為Overrides的按鈕,下面的列表中就列出了能夠重載的函數(shù),找到OnCreateClient生成重載函數(shù)。 3. 在MainFrm.cpp文件中找到剛重載的OnCreateClient函數(shù)修改如下: C++代碼
4. 在Resource View資源視圖中,打開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. 在父框架類中定義一個(gè)CSplitterWnd類型的成員對(duì)象。 2. 重載父框架類的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í)例,目的是在主框架窗口中的客戶區(qū)創(chuàng)建一個(gè)兩行一列的靜態(tài)分割窗口。如果已經(jīng)試驗(yàn)過(guò)動(dòng)態(tài)分割窗口的創(chuàng)建,那么麻煩撤銷那些修改吧。創(chuàng)建靜態(tài)分割窗口的具體步驟如下: 1. 在MainFrm.h文件中為CMainFrame類添加成員對(duì)象:CSplitterWnd m_wndSplitter;。 2. 在Class View類視圖中找到CMainFrame類,右鍵點(diǎn)擊,在右鍵菜單中選擇Properties,就會(huì)顯示屬性頁(yè),然后在屬性頁(yè)的工具欄上點(diǎn)擊Tip為Overrides的按鈕,下面的列表中就列出了能夠重載的函數(shù),找到OnCreateClient生成重載函數(shù)。 3. 在MainFrm.cpp文件中找到剛重載的OnCreateClient函數(shù)進(jìn)行修改。因?yàn)殡u啄米沒有新建其他視圖類,所以上下兩個(gè)窗格的視圖都是CExample34View。為了能識(shí)別CExample34View類,還需在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)容就講到這里了。雞啄米依然謝謝大家的支持。 |
|
|