VS2010-MFC(文檔、視圖和框架:分割窗口)

 

轉自:http://www.jizhuomi.com/software/226.htmlhtml

 

上一節講了文檔、視圖和框架結構中各對象之間的關係,本節主要講講在MFC中如何分割窗口。編程

 

      分割窗口概述框架

      分割窗口,顧名思義,就是將一個窗口分割成多個窗格,在每一個窗格中都包含有視圖,或者是同一類型的視圖,或者是不一樣類型的視圖。ide

       MFC分割窗口的方式有兩種,動態分割和靜態分割。函數

       動態分割窗口一般用於建立同一個文檔對應的多個視圖,並且這些視圖通常都是同一類型的視圖,可以在用戶編輯文檔的不一樣部分時提供方便。工具

       你們看下Word裏的動態分割窗口就很明白了,以Word 2007文檔爲例,在菜單中點擊「視圖」->「拆分」,就能夠看到一條隨鼠標移動的分隔條,當咱們在文檔中某個位置按下鼠標左鍵時,分割條就固定了下來,生成了上下兩個分割窗格,經過滾動每一個窗格中的垂直滾動條能夠看到,兩個窗格中的內容相同,這就是所說的對應同一個文檔的同一類視圖。this

       動態分割窗口最多能夠有兩行兩列。spa

       靜態分割窗口比較常見。咱們常常能看到某個軟件打開後,界面窗口默認被分割成了幾個窗格,這就是靜態分割窗口。3d

       靜態分割窗口指在窗口建立時,分割的窗格就已經生成了,並且用戶不能改變窗格的數量和順序。靜態分割窗口最多支持16行16列。一般靜態分割窗口的每一個窗格中包含不一樣類的視圖,固然也能夠是同一類的視圖。指針

 

 

       CSplitterWnd類

       MFC中的分割窗口類-CSplitterWnd類提供了分割窗口的功能。CSplitterWnd類中包含一個分割器窗口,該分割器窗口就是一個包含多個窗格的窗口。咱們分割窗口時就是直接在此分割器窗口中分割的。

       下面介紹三個最經常使用的成員函數:

C++代碼
virtual BOOL Create( CWnd* pParentWnd, int nMaxRows, int nMaxCols, SIZE sizeMin, CCreateContext* pContext, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT, UINT nID = AFX_IDW_PANE_FIRST );  

       建立動態分割窗口。參數pParentWnd爲分割器窗口的父框架窗口;參數nMaxRows爲分割器窗口的最大行數,不能超過2;參數nMaxCols爲分割器窗口的最大列數,也不能超過2;參數sizeMin爲窗格能顯示的最小尺寸,若是窗格尺寸小於sizeMin則不顯示;參數pContext爲指向CCreateContext結構的指針,大多數狀況下能夠賦值爲父框架窗口的pContext;參數dwStyle指定窗口風格;參數nID爲分割窗口的ID,除非分割器窗口嵌入到另外一個分割器窗口中,不然能夠取值AFX_IDW_PANE_FIRST。

 

 

C++代碼
virtual BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST ); 

       建立靜態分割窗口。參數pParentWnd、dwStyle和nID同上;參數nRows爲行數,不能超過16;參數nCols爲列數,一樣不能超過16。

 

 

C++代碼
virtual BOOL CreateView ( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext ); 

       爲靜態分割窗口建立窗格視圖。參數row指定分割器窗口中放置新視圖的行;參數col指定放置新視圖的列;參數pViewClass指定新視圖的CRuntimeClass對象;參數sizeInit指定新視圖的初始大小;參數pContext爲指向CCreateContext結構的指針,一般能夠賦值爲傳遞給父框架窗口的重載函數CFrameWnd::OnCreateClient的pContext參數值。

 

 

       動態分割窗口

       建立動態分割窗口的步驟爲:

       1. 在父框架類中定義一個CSplitterWnd類型的成員對象。

       2. 重載父框架類的CFrameWnd::OnCreateClient成員函數。

       3. 在重載的CFrameWnd::OnCreateClient函數中調用CSplitterWnd成員對象的Create函數。

 

       下面給你們演示一個實例。一樣以VS2010/MFC編程入門之三十四(菜單:VS2010菜單資源詳解)中建立Example34工程爲例,咱們要實如今主框架窗口的客戶區中建立兩行兩列的動態分割窗口。如下是建立動態分割窗口的具體步驟:

       1. 在MainFrm.h文件中爲CMainFrame類添加成員對象:CSplitterWnd m_wndSplitter;。

       2. 在Class View類視圖中找到CMainFrame類,右鍵點擊,在右鍵菜單中選擇Properties,就會顯示屬性頁,而後在屬性頁的工具欄上點擊Tip爲Overrides的按鈕,下面的列表中就列出了可以重載的函數,找到OnCreateClient生成重載函數。

       3. 在MainFrm.cpp文件中找到剛重載的OnCreateClient函數修改以下:

C++代碼
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class // 建立動態分割窗口,兩行兩列  return m_wndSplitter.Create(this,2, 2, CSize(10, 10), pContext); //return CFrameWndEx::OnCreateClient(lpcs, pContext);  } 
 

       4. 在Resource View資源視圖中,打開Menu下的IDR_MAINFRAME菜單,在View下添加一個菜單項,Caption設爲Splitter Window,ID設爲(必定要設爲)ID_WINDOW_SPLIT。這樣在運行結果界面中點擊此菜單項時MFC會執行一些操做顯示動態分割窗口。

       5. 運行程序,點擊菜單中的View->Splitter Window菜單項,建立動態分割窗口後效果以下:

 

 

 

       靜態分割窗口

       建立靜態分割窗口的步驟爲:

       1. 在父框架類中定義一個CSplitterWnd類型的成員對象。

       2. 重載父框架類的CFrameWnd::OnCreateClient成員函數。

       3. 在重載的CFrameWnd::OnCreateClient函數中調用CSplitterWnd成員對象的CreateStatic成員函數,而後能夠調用CSplitterWnd成員對象的CreateView成員函數爲每一個窗格建立視圖。 

 

 

       下面仍經過Example34工程給你們一個實例,目的是在主框架窗口中的客戶區建立一個兩行一列的靜態分割窗口。若是已經試驗過動態分割窗口的建立,那麼麻煩撤銷那些修改吧。建立靜態分割窗口的具體步驟以下:

       1. 在MainFrm.h文件中爲CMainFrame類添加成員對象:CSplitterWnd m_wndSplitter;。

       2. 在Class View類視圖中找到CMainFrame類,右鍵點擊,在右鍵菜單中選擇Properties,就會顯示屬性頁,而後在屬性頁的工具欄上點擊Tip爲Overrides的按鈕,下面的列表中就列出了可以重載的函數,找到OnCreateClient生成重載函數。

       3. 在MainFrm.cpp文件中找到剛重載的OnCreateClient函數進行修改。由於雞啄米沒有新建其餘視圖類,因此上下兩個窗格的視圖都是CExample34View。爲了能識別CExample34View類,還需在MainFrm.cpp文件中添加#include "Example34View.h",在Example34View.h文件中添加#include "Example34Doc.h"。最終OnCreateClient函數修改以下:

C++代碼
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class   CRect rc; // 獲取框架窗口客戶區的CRect對象  GetClientRect(&rc); // 建立靜態分割窗口,兩行一列  if (!m_wndSplitter.CreateStatic(this, 2, 1)) return FALSE; // 建立上面窗格中的視圖  if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext)) return FALSE; // 建立下面窗格中的視圖  if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext)) return FALSE; return TRUE; //return CFrameWndEx::OnCreateClient(lpcs, pContext);  } 
 

       4. 運行程序,在結果界面中關掉其餘面板後效果以下:

 

 

 

       若是你們想建立在其中某個窗格中再嵌套分割窗口,那麼就須要再定義一個CSplitterWnd對象,以父窗格所在的CSplitterWnd對象爲父框架窗口建立分割窗口便可。

相關文章
相關標籤/搜索