日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)

發(fā)布時(shí)間:2024/9/5 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸡啄米vc++2010系列40(文档、视图和框架:分割窗口) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分割窗口概述

??????分割窗口,顧名思義,就是將一個(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++代碼
  • 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? ??
  • );??
  • ?????? 創(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++代碼
  • virtual?BOOL?CreateStatic( ??
  • ???CWnd*?pParentWnd, ??
  • ???int?nRows, ??
  • ???int?nCols, ??
  • ???DWORD?dwStyle?=?WS_CHILD?|?WS_VISIBLE, ??
  • ???UINT?nID?=?AFX_IDW_PANE_FIRST? ??
  • );??
  • ??? ?? 創(chuàng)建靜態(tài)分割窗口。參數(shù)pParentWnd、dwStyle和nID同上;參數(shù)nRows為行數(shù),不能超過(guò)16;參數(shù)nCols為列數(shù),同樣不能超過(guò)16。

    C++代碼
  • virtual?BOOL?CreateView( ??
  • ???int?row, ??
  • ???int?col, ??
  • ???CRuntimeClass*?pViewClass, ??
  • ???SIZE?sizeInit, ??
  • ???CCreateContext*?pContext? ??
  • );??
  • ?????? 為靜態(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++代碼
  • BOOL?CMainFrame::OnCreateClient(LPCREATESTRUCT?lpcs,?CCreateContext*?pContext) ??
  • { ??
  • ?//?TODO:?Add?your?specialized?code?here?and/or?call?the?base?class???
  • ?//?創(chuàng)建動(dòng)態(tài)分割窗口,兩行兩列???
  • ?return?m_wndSplitter.Create(this,2,?2,?CSize(10,?10),?pContext); ??
  • ??
  • ?//return?CFrameWndEx::OnCreateClient(lpcs,?pContext);???
  • }??
  • ?????? 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++代碼
  • BOOL?CMainFrame::OnCreateClient(LPCREATESTRUCT?lpcs,?CCreateContext*?pContext) ??
  • { ??
  • ????//?TODO:?Add?your?specialized?code?here?and/or?call?the?base?class???
  • ????CRect?rc; ??
  • ??
  • ????//?獲取框架窗口客戶(hù)區(qū)的CRect對(duì)象???
  • ????GetClientRect(&rc); ??
  • ??
  • ????//?創(chuàng)建靜態(tài)分割窗口,兩行一列???
  • ????if?(!m_wndSplitter.CreateStatic(this,?2,?1)) ??
  • ????????return?FALSE; ??
  • ??
  • ????//?創(chuàng)建上面窗格中的視圖???
  • ????if?(!m_wndSplitter.CreateView(0,?0,?RUNTIME_CLASS(CExample34View),?CSize(rc.Width(),?rc.Height()/2),?pContext)) ??
  • ????????return?FALSE; ??
  • ??
  • ????//?創(chuàng)建下面窗格中的視圖???
  • ????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. 運(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。