999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于MFC的窗口Z坐標(biāo)保存與恢復(fù)算法

2008-01-01 00:00:00宋松偉段紅光
計(jì)算機(jī)時(shí)代 2008年5期

摘要:在大型專業(yè)軟件的工程管理中,要求在打開一個(gè)工程的時(shí)候,能夠恢復(fù)其保存時(shí)的所有信息,窗口恢復(fù)是其中的重點(diǎn),而窗口Z坐標(biāo)處理是窗口恢復(fù)的難點(diǎn),也是實(shí)現(xiàn)窗口恢復(fù)的關(guān)鍵。文章以自動(dòng)處理窗口信息來實(shí)現(xiàn)工程中各獨(dú)立窗口所有信息的輕松保存與恢復(fù)為目標(biāo),提供一種基于MFC的視圖Z坐標(biāo)保存與恢復(fù)算法。

關(guān)鍵詞:窗口;Z坐標(biāo);算法;消息

引言

在一個(gè)大型專業(yè)軟件項(xiàng)目中,存在很多不同類型的窗口。而一個(gè)優(yōu)秀的專業(yè)軟件,在工程管理方面,應(yīng)該能夠在打開一個(gè)舊的工程時(shí),自動(dòng)恢復(fù)該工程關(guān)閉時(shí)的所有信息。然而,由于實(shí)現(xiàn)的難度大,許多專業(yè)軟件都沒有這一功能,用戶在打開一個(gè)工程后,往往還要手動(dòng)調(diào)整以恢復(fù)到需要的操作狀態(tài),這給用戶帶來極大不便。

面對(duì)不同類型的窗口對(duì)象,找到一個(gè)簡單通用的工程視圖信息保存與恢復(fù)算法,以支持窗口恢復(fù),提高軟件的友好性與操作便利性,顯得十分必要。窗口Z坐標(biāo)處理是窗口恢復(fù)的難點(diǎn),也是實(shí)現(xiàn)窗口恢復(fù)的關(guān)鍵,只要解決了窗口Z坐標(biāo)處理的問題,實(shí)現(xiàn)窗口恢復(fù)便不再困難。本文充分利用Windows系統(tǒng)的消息機(jī)制,以自動(dòng)處理窗口信息、實(shí)現(xiàn)工程中各獨(dú)立窗口所有信息輕松保存與恢復(fù)為目標(biāo),提供一種基于MFC的視圖Z坐標(biāo)保存與恢復(fù)算法。在實(shí)現(xiàn)的過程中,建立一個(gè)文檔類和一個(gè)視圖類,在這兩個(gè)類中實(shí)現(xiàn)這一套算法,其它的不同類型的窗口只需從這兩個(gè)類派生,就能一勞永逸地實(shí)現(xiàn)窗口Z坐標(biāo)保存與恢復(fù),進(jìn)而實(shí)現(xiàn)窗口恢復(fù)。這是一個(gè)通用的算法,可以應(yīng)用在任何使用MFC文檔視圖結(jié)構(gòu)的應(yīng)用程序中。

1、MFC文檔管理解析

MFC(Microsoft Foundation Class Library)是一個(gè)編程框架,將其中的各種類結(jié)合起來就能構(gòu)成一個(gè)應(yīng)用程序框架。MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。文檔視圖結(jié)構(gòu)(Document/ViewArchitecture)是MFC的精髓,也是Observer模式的具體實(shí)現(xiàn)框架之一,Document/View Architecture通過將數(shù)據(jù)和其表示分開,提供了很好的數(shù)據(jù)層次和表現(xiàn)層次的解耦。

文檔用來保存數(shù)據(jù),提供對(duì)數(shù)據(jù)進(jìn)行處理的主要方法,并為視圖顯示提供數(shù)據(jù)。一個(gè)文檔可以擁有多個(gè)視圖。視圖在Windows中就是一個(gè)窗口,也就是一個(gè)可視化的矩形區(qū)域,用來展示文檔中的數(shù)據(jù)。每個(gè)視圖必須依附于一個(gè)框架。框架實(shí)際也是一個(gè)Windows窗口,但是在框架上可以放置菜單、工具欄、狀態(tài)欄等,而視圖則放在框架的客戶區(qū)。因此在MFC中我們看到的窗口實(shí)際上是Frame和View共同作用的結(jié)果。在某一具體時(shí)刻,程序中只有一個(gè)活動(dòng)的文檔、框架和視圖,即當(dāng)前的文檔、框架、視圖。文檔視圖結(jié)構(gòu)如圖1所示。

圖2示出了MFC多文檔管理方法。MFC文檔視圖結(jié)構(gòu)的應(yīng)用程序類CWinApp可以包含多個(gè)文檔模板對(duì)象,MFC通過文檔模板管理類CDocManager對(duì)這些文檔模板對(duì)象進(jìn)行管理。文檔模板管理類中包含一個(gè)鏈表CPtrList m_templateList,用于保存程序中加入的文檔模板類對(duì)象。

文檔模板管理類CDocManager是一個(gè)隱藏的類,甚至在MSDN中都找不到其相關(guān)說明。在應(yīng)用程序類中,可以直接通過函數(shù)AddDocTemplate把已定義的文檔模板對(duì)象加入到文檔模板管理類對(duì)象m_pDocManager中。函數(shù)AddDocTemplate的原型為:

void AddDocTemplate(CDocTemplate* pTemplate);

pTemplate是要添加的文檔模板的指針。

文檔模板類CDocTemplate統(tǒng)一了文檔和視圖,CDocTem-plate在定義時(shí)必須指明一個(gè)文檔類、一個(gè)框架類和一個(gè)視圖類。這三個(gè)類的不同,形成了各式各樣的窗口。多文檔模板類CMuliiDocTemplate派生于CDocTemplate,其中增加了一個(gè)保護(hù)型鏈表成員CPtrList m_docList用來保存相應(yīng)文檔類所打開的各個(gè)文檔。這樣,應(yīng)用程序就和文檔有機(jī)地結(jié)合起來。

MFC通過文檔模板管理類,文檔模板類,文檔這三層關(guān)系緊密結(jié)合,有機(jī)地管理著程序中的文檔。

基于以上MFC文檔視圖結(jié)構(gòu)及其多文檔管理方法,我們?cè)O(shè)計(jì)出以下一套窗口Z坐標(biāo)的保存與恢復(fù)算法。本算法把窗口信息保存在與之相對(duì)應(yīng)的文檔中,將視圖類與框架類結(jié)合,處理窗口操作信息。

2、窗口Z坐標(biāo)的提取與保存

窗口Z坐標(biāo)用以表示窗口前后位置,表明在多窗口的情況下,哪個(gè)窗口在前面,哪個(gè)在后面(被遮住)。窗口Z坐標(biāo)的保存過程,即是提取窗口Z坐標(biāo)并保存在適當(dāng)?shù)胤降倪^程。本文為實(shí)現(xiàn)窗口z坐標(biāo)處理,自定義兩個(gè)消息,即:WM_GETWNDPOS,用于提取窗口Z坐標(biāo);WM_SETWNDPOS,用于窗口Z坐標(biāo)的恢復(fù)處理。自定義消息由消息名稱和消息處理函數(shù)兩部分組成。其中,消息名稱是消息的標(biāo)識(shí),為一個(gè)常數(shù),常用宏的形式給出;消息處理函數(shù)即消息處理的方法,它帶兩個(gè)參數(shù),通過這兩個(gè)參數(shù),實(shí)現(xiàn)窗口之間信息的傳遞,這兩個(gè)參數(shù)在發(fā)送消息時(shí),由消息發(fā)送函數(shù)帶進(jìn)來。

消息WM_GETWNDPOS的處理函數(shù)是OnGetWndPos,它接收一個(gè)有效參數(shù)wParam,用于計(jì)算窗口的坐標(biāo)z。消息處理算法流程圖如圖3所示。

2.1算法解析

消息WM_GETWNDPOS傳遞參數(shù)wParam,通過在各個(gè)窗口之間傳遞,可逐一得到各窗口Z坐標(biāo)。以下是結(jié)合圖3對(duì)該算法的解析,其中的關(guān)鍵點(diǎn)如取頂層窗口的方法等在算法實(shí)現(xiàn)部分給出。

z坐標(biāo)的提取算法從當(dāng)前激活窗口也就是頂層窗口開始執(zhí)行。算法啟動(dòng),首先取上層窗口,如果不成功,則證明本窗口為最頂層窗口,置z=0。如果沒有得到上層窗口,則wParam+l即為當(dāng)前窗口z坐標(biāo)。

為本窗口設(shè)置完z坐標(biāo)后,取下層窗口,如果成功,則把wParam作為參數(shù),向下層窗口發(fā)送本消息。如果沒有下層窗口,證明所有窗口已全部計(jì)算完畢,提取Z坐標(biāo)處理終止。

通過以上算法,得到窗口的Z坐標(biāo),然后將數(shù)據(jù)保存到文檔,并進(jìn)一步保存到文件中,為窗口恢復(fù)準(zhǔn)備數(shù)據(jù)。

2.2算法實(shí)現(xiàn)

2.2.1取頂層窗口

頂層窗口就是當(dāng)前處于激活狀態(tài)的窗口,處于所有窗口的頂層。它代表著當(dāng)前活動(dòng)的文檔、框架和視圖,可以通過取主框架窗口類的活動(dòng)框架,然后進(jìn)一步取其活動(dòng)視圖來得到。在MFC中可以用標(biāo)準(zhǔn)方法GetActiveFrame和GetActiveView分別實(shí)現(xiàn)。

2.2.2取下一窗口的方法

視圖類沒有取下一窗口的方法,但框架類有。所以取下一窗口,首先要用GetParentFrame函數(shù)得到視圖類的父框架,然后通過框架窗口的GetNextWindow函數(shù)來得到下一窗口,如果成功,函數(shù)返回下一窗口的指針,否則返回NULL。GetNextWindow函數(shù)帶一個(gè)參數(shù)nFlag,nFlag有兩種取值:GW_HWNDNEXT、GW_HWNDPREV,分別用來取下層和上層窗口,這i-i5函數(shù)的具體用法,參見MSDN。

2.2.3發(fā)進(jìn)消息

Windows通過消息實(shí)現(xiàn)窗口之間數(shù)據(jù)的傳遞。向窗口發(fā)送消息,用Windows API函數(shù)SendMessage,其原型如下:

LRESULT SendMessage(HWND hWnd,UINT Msg,

WPARAM wParam,LPARAM IParam);

hWnd為消息目標(biāo)窗口句柄。Msg為要發(fā)送的消息。wParam,IParam為消息參數(shù)。

本消息傳遞的四個(gè)參數(shù)是:消息的目的地(下一個(gè)窗口);消息名稱WM_GE7WNDPOS;消息參數(shù)wParam;還有一個(gè)參數(shù)不使用,填為0即可。

3、窗口Z坐標(biāo)的恢復(fù)方法

窗口Z坐標(biāo)的恢復(fù),即是在所需窗口全部打開后,根據(jù)工程文件中保存的Z坐標(biāo)數(shù)據(jù),調(diào)整窗口的前后位置至工程保存前的狀態(tài)。

自定義消息WM_SETWNDPOS,處理函數(shù)OnSetWndPos。用來設(shè)置Z坐標(biāo)。它接收一個(gè)參數(shù)wParam,wParam用于控制本消息的正常路由方向。打開工程后,可根據(jù)工程參數(shù)創(chuàng)建相應(yīng)的各類型窗口(創(chuàng)建窗口的方法可參見3.2.1)。自定義消息處理算法流程圖如圖4所示。

3.1算法解析

Z坐標(biāo)恢復(fù)過程可以選擇在任意一窗口啟動(dòng),為方便起見,這里取頂層窗口。

算法開始,從文件中讀取Z坐標(biāo)z并賦予臨時(shí)坐標(biāo)zT,對(duì)zT進(jìn)行處理,從而防止改變坐標(biāo)z,然后移動(dòng)窗口。進(jìn)一步計(jì)算消息路由條件。如果消息應(yīng)該繼續(xù)路由,則向路由方向上的下一窗口路由消息;如果不再滿足路由條件,則退出算法,也同時(shí)結(jié)束了Z坐標(biāo)的恢復(fù)過程。

3.2算法實(shí)現(xiàn)

3.2.1創(chuàng)建所有窗口

Z坐標(biāo)恢復(fù)的前提是所有窗口已經(jīng)創(chuàng)建。而要?jiǎng)?chuàng)建一個(gè)窗口,只需有這個(gè)窗口的類型,也就是知道文檔模板類對(duì)象,然后通過CDocTemplate:OpenDocumentFile函數(shù)來打開一個(gè)文檔,并同時(shí)創(chuàng)建窗口。

3.2.2移動(dòng)窗口

移動(dòng)窗口,包括移動(dòng)窗口的位置,控制窗口的大小以及改變窗口的z坐標(biāo)。這里主要控制窗口的Z坐標(biāo)。可使用CWnd類的SetWindowPos函數(shù),原型為:

BOOL SetWindowPos(const CWnd*pWndlnsertAfter,int x,

int y,int cx,int cy,UINT nFlags);

參數(shù)說明:pWndlnsertAfter,指名移動(dòng)窗口的位置,也就是把窗口移動(dòng)到哪一個(gè)窗口的后面。可以有四個(gè)取值:wndBottom,wndTop,wndTopMost,wndNoTopMost。x,y,cx,cy,指定窗口大小。nFlags是大小和位置處理方式的指示。

本算法中移動(dòng)窗口,還包括對(duì)臨時(shí)坐標(biāo)zT操作:首先定義COMNUM代表最大窗口個(gè)數(shù),為一個(gè)足夠大的值,可以取500。COMMAX為一個(gè)較COMNUM大的值,用作輔助標(biāo)記,可取1000。觀察ZT是否等于0,如果等于o,則移動(dòng)窗口至最底層,并置zT=COMMAX,否則,讓zT自減1。置zT=COMMAX,就是讓zT成為一個(gè)很大的值,這將在計(jì)算路由條件時(shí)用到。

3.2.3路由條件

路由條件就是決定消息是否繼續(xù)路由的條件,同時(shí)還包含消息路由所必需的消息,如消息路由方向,路由數(shù)據(jù)等。路由條件由消息參數(shù)wParam及zT共同決定。wParam控制初始路由方向,wParam=1時(shí),消息向上層窗口傳遞,wParam=0時(shí),消息向下層窗口傳遞。zT為臨時(shí)z坐標(biāo),窗口的每一次操作都會(huì)改變zT。通過觀察zT的變化與取值,結(jié)合路由方向,可計(jì)算出路由條件。

路由條件計(jì)算方法:通過zT

4、算法復(fù)雜度

窗口z坐標(biāo)的提取算法:

提取算法比較簡單,由于各窗口僅需遍歷一遍,其復(fù)雜度為0(N)。

窗口z坐標(biāo)的恢復(fù)算法:

每一個(gè)窗口的臨時(shí)坐標(biāo)zT根據(jù)z自減至0時(shí)算法即結(jié)束。其復(fù)雜度為:

1+2+3+…+n-1+n=(n+1)*n/2為O(n2)。

由上述算法復(fù)雜度分析可以得出本文所提供的窗口z坐標(biāo)保存與恢復(fù)算法的復(fù)雜度是很低的。在實(shí)際應(yīng)用中它能在毫無感覺的情況下保存和恢復(fù)眾多窗口,滿足復(fù)雜專業(yè)項(xiàng)目應(yīng)用要求。

5、結(jié)束語

窗口Z坐標(biāo)的提取、保存與恢復(fù)是實(shí)現(xiàn)大型專業(yè)軟件項(xiàng)目工程保存與恢復(fù)的關(guān)鍵技術(shù),處理了Z坐標(biāo),就可以進(jìn)一步完成整個(gè)項(xiàng)目工程的保存與恢復(fù)了。本算法基于MFC,以較低的復(fù)雜度實(shí)現(xiàn)了窗口Z坐標(biāo)的快速恢復(fù),具有很好的實(shí)用價(jià)值。同時(shí),本算法具有很強(qiáng)的通用性,可以輕松地應(yīng)用到任何基于MFC的軟件。

該算法已在3G移動(dòng)通信路測(cè)軟件項(xiàng)目中成功使用。

主站蜘蛛池模板: 五月天综合婷婷| 日韩成人高清无码| 国产美女无遮挡免费视频| 69综合网| 欧美日韩国产在线观看一区二区三区| 亚洲欧美另类视频| 精品伊人久久久香线蕉| 亚洲天堂视频网站| 国产精品一区二区无码免费看片| a在线亚洲男人的天堂试看| 日韩福利在线观看| 亚洲一级色| 亚洲第一视频区| 成人精品亚洲| 色婷婷狠狠干| 欧美午夜小视频| 91年精品国产福利线观看久久 | 一区二区三区成人| 777国产精品永久免费观看| 亚洲一区二区三区国产精品| 日韩成人免费网站| 毛片卡一卡二| 欧美国产菊爆免费观看| 久久久成年黄色视频| 成人噜噜噜视频在线观看| 欧美成人一区午夜福利在线| 久久频这里精品99香蕉久网址| 国产人碰人摸人爱免费视频| 国产麻豆永久视频| 欧美中出一区二区| 亚洲成在人线av品善网好看| 久久国产av麻豆| 亚洲欧美在线综合一区二区三区 | 91久久大香线蕉| 国产XXXX做受性欧美88| 国产真实乱子伦精品视手机观看| 亚洲中文字幕手机在线第一页| 日韩无码视频播放| 91毛片网| 国产成在线观看免费视频| 国产拍在线| 久久美女精品| 国产嫖妓91东北老熟女久久一| 亚洲一区网站| 久久久无码人妻精品无码| 国产永久免费视频m3u8| 婷婷色在线视频| 91青青草视频| 成人国产一区二区三区| 72种姿势欧美久久久大黄蕉| 亚洲第一天堂无码专区| 又猛又黄又爽无遮挡的视频网站| 国模私拍一区二区| 少妇人妻无码首页| 亚洲综合狠狠| 在线99视频| 国产精品私拍在线爆乳| 91av国产在线| 国内精自线i品一区202| 无码一区二区三区视频在线播放| 福利在线一区| 亚洲综合欧美在线一区在线播放| 久久99国产精品成人欧美| 久一在线视频| 麻豆精品国产自产在线| 黄色成年视频| 在线网站18禁| 亚洲欧美不卡| 亚洲香蕉久久| 国产一国产一有一级毛片视频| 色综合手机在线| 蜜桃臀无码内射一区二区三区| 国产18在线| 真实国产乱子伦高清| 婷婷综合缴情亚洲五月伊| 国产精品毛片一区| 国产一级毛片网站| 亚欧美国产综合| 日韩精品一区二区三区中文无码 | 国产视频a| 伊人久综合| 国产玖玖视频|