小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VS2010/MFC編程入門之四十一(文檔、視圖和框架:分割窗口)

 牛人的尾巴 2015-10-27

      上一節(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++代碼
  1. virtual BOOL Create(   
  2.    CWnd* pParentWnd,   
  3.    int nMaxRows,   
  4.    int nMaxCols,   
  5.    SIZE sizeMin,   
  6.    CCreateContext* pContext,   
  7.    DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,   
  8.    UINT nID = AFX_IDW_PANE_FIRST    
  9. );  

       創(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++代碼
  1. virtual BOOL CreateStatic(   
  2.    CWnd* pParentWnd,   
  3.    int nRows,   
  4.    int nCols,   
  5.    DWORD dwStyle = WS_CHILD | WS_VISIBLE,   
  6.    UINT nID = AFX_IDW_PANE_FIRST    
  7. );  

       創(chuàng)建靜態(tài)分割窗口。參數(shù)pParentWnd、dwStyle和nID同上;參數(shù)nRows為行數(shù),不能超過(guò)16;參數(shù)nCols為列數(shù),同樣不能超過(guò)16。

C++代碼
  1. virtual BOOL CreateView(   
  2.    int row,   
  3.    int col,   
  4.    CRuntimeClass* pViewClass,   
  5.    SIZE sizeInit,   
  6.    CCreateContext* pContext    
  7. );  

       為靜態(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++代碼
  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)   
  2. {   
  3.  // TODO: Add your specialized code here and/or call the base class   
  4.  // 創(chuàng)建動(dòng)態(tài)分割窗口,兩行兩列   
  5.  return m_wndSplitter.Create(this,2, 2, CSize(10, 10), pContext);   
  6.   
  7.  //return CFrameWndEx::OnCreateClient(lpcs, pContext);   
  8. }  

       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)分割窗口后效果如下:

 動(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++代碼
  1. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)   
  2. {   
  3.     // TODO: Add your specialized code here and/or call the base class   
  4.     CRect rc;   
  5.   
  6.     // 獲取框架窗口客戶區(qū)的CRect對(duì)象   
  7.     GetClientRect(&rc);   
  8.   
  9.     // 創(chuàng)建靜態(tài)分割窗口,兩行一列   
  10.     if (!m_wndSplitter.CreateStatic(this, 2, 1))   
  11.         return FALSE;   
  12.   
  13.     // 創(chuàng)建上面窗格中的視圖   
  14.     if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
  15.         return FALSE;   
  16.   
  17.     // 創(chuàng)建下面窗格中的視圖   
  18.     if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CExample34View), CSize(rc.Width(), rc.Height()/2), pContext))   
  19.         return FALSE;   
  20.   
  21.     return TRUE;   
  22.   
  23.     //return CFrameWndEx::OnCreateClient(lpcs, pContext);   
  24. }  

       4. 運(yùn)行程序,在結(jié)果界面中關(guān)掉其他面板后效果如下:

 靜態(tài)分割窗口

       如果大家想創(chuàng)建在其中某個(gè)窗格中再嵌套分割窗口,那么就需要再定義一個(gè)CSplitterWnd對(duì)象,以父窗格所在的CSplitterWnd對(duì)象為父框架窗口創(chuàng)建分割窗口即可。

       分割窗口的內(nèi)容就講到這里了。雞啄米依然謝謝大家的支持。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多