當(dāng)前位置:首頁(yè) > 工業(yè)控制 > 電子設(shè)計(jì)自動(dòng)化
[導(dǎo)讀]摘要:本文以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ù)。 前言在許多視

摘要:本文以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ù)成員)。

⑵重載視窗框架類(lèi)別中的OnCreateClient函數(shù)(CFrameWnd::OnCreateClient),建立靜態(tài)分裂子視窗,為靜態(tài)分裂子視窗填充視圖。

⑶建立維持各子視窗同步更新的機(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í),如何讓其它View控件同步更新數(shù)據(jù)?可以通過(guò)文檔類(lèi)別(CDocument)的UpdateAllViews(CView* pSender,LPARAM lHint,CObject* pHint)成員函數(shù)的調(diào)用,再由該函數(shù)分別調(diào)用目前存在于視窗程序中各View控件的On Update函數(shù)來(lái)完成數(shù)據(jù)的同步更新。

UpdateAllViews函數(shù)的參數(shù)含義為:

pSender是指向引發(fā)更新操作的View控件指針,如果傳入NULL表示所有視圖都要執(zhí)行更新操作;

lHint是用于傳送更新視圖時(shí),需要傳送的額外信息參數(shù);

pHint是指向記錄更新視圖所需額外信息的控件。在調(diào)用該函數(shù)時(shí),將View控件的指針傳入的目的是要告訴該函數(shù)該子視圖已經(jīng)完成數(shù)據(jù)更新,該函數(shù)不需要再調(diào)用該子視圖的On Update進(jìn)行數(shù)據(jù)更新。

子視圖的動(dòng)態(tài)切換

在多視圖應(yīng)用程序中,可以通過(guò)改變CCreateContext對(duì)象的值,來(lái)創(chuàng)建更加靈活的視圖,實(shí)現(xiàn)多視圖的動(dòng)態(tài)切換。CCreateContext是MFC框架所使用的一種數(shù)據(jù)結(jié)構(gòu),它將構(gòu)成文檔/視圖結(jié)構(gòu)的組件聯(lián)系起來(lái)。這個(gè)結(jié)構(gòu)包括指向文檔的指針、視窗框架的指針、視圖的指針以及文檔模板的指針,它還包含一個(gè)指向CRuntimeClass結(jié)構(gòu)的指針,以指明所創(chuàng)建的視圖的類(lèi)型。

其數(shù)據(jù)成員如下:

m_pNewViewClass是指向創(chuàng)建上下文的視圖的CRuntimeClass結(jié)構(gòu)的指針;

m_pNewDocTemplate是指向與視窗框架的創(chuàng)建相聯(lián)系的文檔模板的指針;

m_pCurrentDoc是指向文檔對(duì)象的指針,以和新視圖聯(lián)系起來(lái);

m_pLastView是指向已存在的視圖的指針,它是新產(chǎn)生的視圖的模型;

m_pCurrentFrame是指向已存在的視窗框架的指針,它是新產(chǎn)生的視窗框架的模型。

此外,任何一個(gè)從CObject類(lèi)別繼承而來(lái)的子類(lèi)別,在使用宏DECLARE_DYNAMIC、DECLARE_DYNCREATE、DECLARE_SERIAL三個(gè)中的任意一個(gè)時(shí)都會(huì)產(chǎn)生一個(gè)CRuntimeClass結(jié)構(gòu)的靜態(tài)對(duì)象,RUNTIME_CLASS返回的就是這個(gè)對(duì)象的指針,這個(gè)對(duì)象包含了其基類(lèi)和本身在運(yùn)行時(shí)刻的信息。

在單文檔靜態(tài)分裂視窗的應(yīng)用程序中,利用CsplitterWnd類(lèi)別的成員函數(shù)Delete View(int row,int col)可以刪除子視窗的原有視圖,然后再通過(guò)該類(lèi)別的成員函數(shù)Create View為子視窗創(chuàng)建新的視圖。但是,創(chuàng)建新視圖前必須初始化創(chuàng)建上下文相關(guān)指針,即對(duì)CCreateContext結(jié)構(gòu)賦值。值得注意的是,使用Create View函數(shù)創(chuàng)建的新視圖不能自動(dòng)調(diào)用視圖類(lèi)別的成員函數(shù)OnInitialUpdate和自動(dòng)顯示并且激活新視圖,需要人工調(diào)用OnInitialUpdate函數(shù)和ShowWindow(SW_SHOW) 函數(shù),這些函數(shù)的調(diào)用都可以通過(guò)CsplitterWnd類(lèi)別的成員函數(shù)Get Pane(int row,int col)獲得新視圖的指針來(lái)完成。

結(jié)束語(yǔ)

在MFC的框架下,混合分裂視窗有多種編程方法,本文只是從CsplitterWnd類(lèi)別的角度去分析混合靜態(tài)分裂視窗的實(shí)現(xiàn)方法,希望能給讀者起到拋磚引玉的作用。



來(lái)源:ks990次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉