VC++實(shí)現(xiàn)混合靜態(tài)分裂視窗的方法
發(fā)布時(shí)間:2008/8/23 0:00:00 訪問(wèn)次數(shù):561
摘要:本文以mfc(microsoft foundation class library)的csplitterwnd類(lèi)別為基礎(chǔ),通過(guò)對(duì)單文檔視窗的靜態(tài)分裂原理進(jìn)行分析,介紹混合靜態(tài)分裂視窗的實(shí)現(xiàn)方法,并深入闡述子視窗的視圖動(dòng)態(tài)切換技術(shù)。
前言
在許多視窗應(yīng)用軟件中,通常要在屏幕上同時(shí)顯示若干個(gè)子視窗,以顯示同一個(gè)文檔的不同部分,或者是在每個(gè)視窗中分別顯示不同文檔的內(nèi)容。為了實(shí)現(xiàn)多視窗界面,可以采用mdi(multiple document interface)的多文檔模式進(jìn)行處理,但是多文檔的應(yīng)用程序設(shè)計(jì)與維護(hù)相對(duì)于單文檔的應(yīng)用程序而言比較復(fù)雜。而且,如果要在屏幕上同時(shí)顯示多個(gè)子視窗,通常要利用視窗重疊函數(shù)進(jìn)行管理,每個(gè)子視窗的位置往往需要用鼠標(biāo)人為設(shè)定,過(guò)多的人為干預(yù)降低了程序使用的效率。因此,如果能對(duì)單文檔視窗做適當(dāng)?shù)姆至,無(wú)疑程序使用者將可以得到更易于操作的接口,數(shù)據(jù)的顯示也更加直觀和方便。本文通過(guò)對(duì)單文檔視窗的靜態(tài)分裂原理進(jìn)行分析,實(shí)現(xiàn)上述要求。
二分裂視窗的類(lèi)型
視窗的分裂可分為兩種類(lèi)型,一是動(dòng)態(tài)分裂,二是靜態(tài)分裂。動(dòng)態(tài)分裂可以讓使用者通過(guò)拖曳分裂方塊的使用,將視窗分裂。但是,動(dòng)態(tài)分裂最多只可以將視窗分裂為2×2個(gè)子視窗,不能進(jìn)行混合分裂視窗,所有子視窗的屬性和父視窗都是一樣的,而且子視窗的數(shù)據(jù)通常來(lái)源于同一處。而靜態(tài)分裂,使用者除了可以調(diào)整子視窗的大小和進(jìn)行混合分裂視窗外,最多可將視窗分裂為16×16個(gè)子視窗,每個(gè)子視窗可以有各自不同的視圖類(lèi)(cview),各個(gè)子視窗顯示的數(shù)據(jù)可以來(lái)自于不同的數(shù)據(jù)源。不論是要?jiǎng)?chuàng)建動(dòng)態(tài)分裂視窗還是靜態(tài)分裂視窗,都必須要利用mfc的csplitterwnd類(lèi)別來(lái)完成視窗的分裂。
混合靜態(tài)分裂視窗的實(shí)現(xiàn)
混合分裂視窗是指在子視窗中進(jìn)行視窗的再分裂。在mfc的框架下,混合分裂視窗必須完成三件工作:
、旁谝暣翱蚣茴(lèi)別中定義csplitterwnd控件為其屬性(數(shù)據(jù)成員)。
、浦剌d視窗框架類(lèi)別中的oncreateclient函數(shù)(cframewnd::oncreateclient),建立靜態(tài)分裂子視窗,為靜態(tài)分裂子視窗填充視圖。
、墙⒕S持各子視窗同步更新的機(jī)制。
首先,利用mfc appwizard生成一個(gè)單文檔應(yīng)用程序,在應(yīng)用程序的cmainframe類(lèi)別中聲明csplitterwnd類(lèi)別的數(shù)據(jù)成員。
其次,重載cmainframe類(lèi)別中的oncreateclient(lpcreatestruct,ccreatecontext* pcontext)函數(shù)。在該函數(shù)中利用csplitterwnd類(lèi)別的構(gòu)造函數(shù)create static(cwnd *pparentwnd,int nrows,int ncols,dword dwstyle,uint nid) 創(chuàng)建混合靜態(tài)分裂子視窗,即在create static分裂出的子視窗中利用csplitterwnd類(lèi)別的控件再一次分裂視窗。
create static函數(shù)的參數(shù)含義為:
pparentwnd是準(zhǔn)備建立靜態(tài)分裂視窗的視窗框架控件的指針;
nrows和ncols是準(zhǔn)備建立靜態(tài)分裂視窗行數(shù)(nrows)與列數(shù)(ncols)
因此,創(chuàng)建的靜態(tài)分裂子視窗個(gè)數(shù)為nrows × ncols個(gè),這兩個(gè)參數(shù)最小不得小于0,最大不可超過(guò)16;dwstyle是設(shè)定子視窗的形式;nid靜態(tài)分裂的代號(hào)(id),此代號(hào)預(yù)設(shè)為afx_idw_pane_first,若靜態(tài)分裂視窗位于另一個(gè)分裂視窗內(nèi)時(shí),不可以使用默認(rèn)值,可以利用csplitterwnd類(lèi)別的成員函數(shù)idfromrowcol(int row,int col)獲得。利用csplitterwnd類(lèi)別的成員函數(shù)create view (int row,int col,cruntimeclass* pviewclass,size sizeinit,ccreatecontext* pcontext) 為靜態(tài)分裂子視窗填充視圖,在將視圖與子視窗關(guān)聯(lián)時(shí)必須先完成子視窗的創(chuàng)建。
create view函數(shù)的參數(shù)含義為:
row和col是指定準(zhǔn)備建立view控件的子視窗,其指定的方式是以表示該子視窗所在的行列位置;
pviewclass是指定用于建立子視窗view控件的view類(lèi)別,該類(lèi)別需要被聲明為run-time類(lèi)別;
sizeini是view控件的起始大小;pcontext是一個(gè)指向記錄應(yīng)用程序所使用的視窗框架控件、document控件,以及view控件之變量的指針,此參數(shù)在cmainframe::oncreateclient函數(shù)被調(diào)用時(shí)傳入,再由該函數(shù)傳遞給此函數(shù)。
csplitterwnd類(lèi)別的成員函數(shù)setcolumninfo(int col,int cxideal,int cxmin)和setrowinfo(int row,int cyideal,cymin)為設(shè)置子視窗的寬度和高度,參數(shù)cxideal和cxmin是指定子視窗的寬度和最小寬度,cyideal和cymin是指定子視窗的高度和最小高度,在使用這兩個(gè)函數(shù)調(diào)整子視窗的大小后還應(yīng)該使用該類(lèi)別的成員函數(shù)recallayout()重新調(diào)整視窗框架的布局。如果要設(shè)定視窗框架里的活動(dòng)子視窗,可以通過(guò)csplitterwnd類(lèi)別的成員函數(shù)setactivepane(int row,int col,cwnd* pwnd=null)來(lái)完成,該函數(shù)指定子視窗的方式有兩種,一是指出子視窗所在的行列,二是傳入指向該子視窗的控件指針。
最后,將視窗分裂成多個(gè)子視窗后,整個(gè)視窗程序中將存在多個(gè)view控件。當(dāng)在其中一個(gè)view控件執(zhí)行更新操作時(shí)
摘要:本文以mfc(microsoft foundation class library)的csplitterwnd類(lèi)別為基礎(chǔ),通過(guò)對(duì)單文檔視窗的靜態(tài)分裂原理進(jìn)行分析,介紹混合靜態(tài)分裂視窗的實(shí)現(xiàn)方法,并深入闡述子視窗的視圖動(dòng)態(tài)切換技術(shù)。
前言
在許多視窗應(yīng)用軟件中,通常要在屏幕上同時(shí)顯示若干個(gè)子視窗,以顯示同一個(gè)文檔的不同部分,或者是在每個(gè)視窗中分別顯示不同文檔的內(nèi)容。為了實(shí)現(xiàn)多視窗界面,可以采用mdi(multiple document interface)的多文檔模式進(jìn)行處理,但是多文檔的應(yīng)用程序設(shè)計(jì)與維護(hù)相對(duì)于單文檔的應(yīng)用程序而言比較復(fù)雜。而且,如果要在屏幕上同時(shí)顯示多個(gè)子視窗,通常要利用視窗重疊函數(shù)進(jìn)行管理,每個(gè)子視窗的位置往往需要用鼠標(biāo)人為設(shè)定,過(guò)多的人為干預(yù)降低了程序使用的效率。因此,如果能對(duì)單文檔視窗做適當(dāng)?shù)姆至眩瑹o(wú)疑程序使用者將可以得到更易于操作的接口,數(shù)據(jù)的顯示也更加直觀和方便。本文通過(guò)對(duì)單文檔視窗的靜態(tài)分裂原理進(jìn)行分析,實(shí)現(xiàn)上述要求。
二分裂視窗的類(lèi)型
視窗的分裂可分為兩種類(lèi)型,一是動(dòng)態(tài)分裂,二是靜態(tài)分裂。動(dòng)態(tài)分裂可以讓使用者通過(guò)拖曳分裂方塊的使用,將視窗分裂。但是,動(dòng)態(tài)分裂最多只可以將視窗分裂為2×2個(gè)子視窗,不能進(jìn)行混合分裂視窗,所有子視窗的屬性和父視窗都是一樣的,而且子視窗的數(shù)據(jù)通常來(lái)源于同一處。而靜態(tài)分裂,使用者除了可以調(diào)整子視窗的大小和進(jìn)行混合分裂視窗外,最多可將視窗分裂為16×16個(gè)子視窗,每個(gè)子視窗可以有各自不同的視圖類(lèi)(cview),各個(gè)子視窗顯示的數(shù)據(jù)可以來(lái)自于不同的數(shù)據(jù)源。不論是要?jiǎng)?chuàng)建動(dòng)態(tài)分裂視窗還是靜態(tài)分裂視窗,都必須要利用mfc的csplitterwnd類(lèi)別來(lái)完成視窗的分裂。
混合靜態(tài)分裂視窗的實(shí)現(xiàn)
混合分裂視窗是指在子視窗中進(jìn)行視窗的再分裂。在mfc的框架下,混合分裂視窗必須完成三件工作:
、旁谝暣翱蚣茴(lèi)別中定義csplitterwnd控件為其屬性(數(shù)據(jù)成員)。
⑵重載視窗框架類(lèi)別中的oncreateclient函數(shù)(cframewnd::oncreateclient),建立靜態(tài)分裂子視窗,為靜態(tài)分裂子視窗填充視圖。
、墙⒕S持各子視窗同步更新的機(jī)制。
首先,利用mfc appwizard生成一個(gè)單文檔應(yīng)用程序,在應(yīng)用程序的cmainframe類(lèi)別中聲明csplitterwnd類(lèi)別的數(shù)據(jù)成員。
其次,重載cmainframe類(lèi)別中的oncreateclient(lpcreatestruct,ccreatecontext* pcontext)函數(shù)。在該函數(shù)中利用csplitterwnd類(lèi)別的構(gòu)造函數(shù)create static(cwnd *pparentwnd,int nrows,int ncols,dword dwstyle,uint nid) 創(chuàng)建混合靜態(tài)分裂子視窗,即在create static分裂出的子視窗中利用csplitterwnd類(lèi)別的控件再一次分裂視窗。
create static函數(shù)的參數(shù)含義為:
pparentwnd是準(zhǔn)備建立靜態(tài)分裂視窗的視窗框架控件的指針;
nrows和ncols是準(zhǔn)備建立靜態(tài)分裂視窗行數(shù)(nrows)與列數(shù)(ncols)
因此,創(chuàng)建的靜態(tài)分裂子視窗個(gè)數(shù)為nrows × ncols個(gè),這兩個(gè)參數(shù)最小不得小于0,最大不可超過(guò)16;dwstyle是設(shè)定子視窗的形式;nid靜態(tài)分裂的代號(hào)(id),此代號(hào)預(yù)設(shè)為afx_idw_pane_first,若靜態(tài)分裂視窗位于另一個(gè)分裂視窗內(nèi)時(shí),不可以使用默認(rèn)值,可以利用csplitterwnd類(lèi)別的成員函數(shù)idfromrowcol(int row,int col)獲得。利用csplitterwnd類(lèi)別的成員函數(shù)create view (int row,int col,cruntimeclass* pviewclass,size sizeinit,ccreatecontext* pcontext) 為靜態(tài)分裂子視窗填充視圖,在將視圖與子視窗關(guān)聯(lián)時(shí)必須先完成子視窗的創(chuàng)建。
create view函數(shù)的參數(shù)含義為:
row和col是指定準(zhǔn)備建立view控件的子視窗,其指定的方式是以表示該子視窗所在的行列位置;
pviewclass是指定用于建立子視窗view控件的view類(lèi)別,該類(lèi)別需要被聲明為run-time類(lèi)別;
sizeini是view控件的起始大;pcontext是一個(gè)指向記錄應(yīng)用程序所使用的視窗框架控件、document控件,以及view控件之變量的指針,此參數(shù)在cmainframe::oncreateclient函數(shù)被調(diào)用時(shí)傳入,再由該函數(shù)傳遞給此函數(shù)。
csplitterwnd類(lèi)別的成員函數(shù)setcolumninfo(int col,int cxideal,int cxmin)和setrowinfo(int row,int cyideal,cymin)為設(shè)置子視窗的寬度和高度,參數(shù)cxideal和cxmin是指定子視窗的寬度和最小寬度,cyideal和cymin是指定子視窗的高度和最小高度,在使用這兩個(gè)函數(shù)調(diào)整子視窗的大小后還應(yīng)該使用該類(lèi)別的成員函數(shù)recallayout()重新調(diào)整視窗框架的布局。如果要設(shè)定視窗框架里的活動(dòng)子視窗,可以通過(guò)csplitterwnd類(lèi)別的成員函數(shù)setactivepane(int row,int col,cwnd* pwnd=null)來(lái)完成,該函數(shù)指定子視窗的方式有兩種,一是指出子視窗所在的行列,二是傳入指向該子視窗的控件指針。
最后,將視窗分裂成多個(gè)子視窗后,整個(gè)視窗程序中將存在多個(gè)view控件。當(dāng)在其中一個(gè)view控件執(zhí)行更新操作時(shí)
熱門(mén)點(diǎn)擊
- CPLD開(kāi)發(fā)板和FPGA開(kāi)發(fā)板的區(qū)別
- 基于FPGA和AD1836的I2S接口設(shè)計(jì)
- vc中如何使用設(shè)備描述表
- Visual C++中調(diào)用DLL實(shí)現(xiàn)數(shù)據(jù)加密
- Visual C++6.0 API函數(shù)操作技
- VC++中進(jìn)程與多進(jìn)程管理的方法
- JavaCard CPU的設(shè)計(jì)與FPGA實(shí)現(xiàn)
- 如何用C語(yǔ)言開(kāi)發(fā)DSP嵌入式系統(tǒng)
- C和C++ 字符串字面量的比較
- Xilinx針對(duì)Virtex-5 FXT F
推薦技術(shù)資料
- 聲道前級(jí)設(shè)計(jì)特點(diǎn)
- 與通常的Hi-Fi前級(jí)不同,EP9307-CRZ這臺(tái)分... [詳細(xì)]
- 電磁與聲學(xué)結(jié)合混合濾波技術(shù)(H
- 超高性能芯片式電磁濾波技術(shù)(S
- 紫、藍(lán)、綠光激光二極管工藝封測(cè)
- SPICE模型ROHM Lev
- 高性能碳化硅(SiC)MOS功
- 新一代光纖通信的光收發(fā)器接收器
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究