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

基于MFC的窗口Z坐標保存與恢復算法

2008-01-01 00:00:00宋松偉段紅光
計算機時代 2008年5期

摘要:在大型專業軟件的工程管理中,要求在打開一個工程的時候,能夠恢復其保存時的所有信息,窗口恢復是其中的重點,而窗口Z坐標處理是窗口恢復的難點,也是實現窗口恢復的關鍵。文章以自動處理窗口信息來實現工程中各獨立窗口所有信息的輕松保存與恢復為目標,提供一種基于MFC的視圖Z坐標保存與恢復算法。

關鍵詞:窗口;Z坐標;算法;消息

引言

在一個大型專業軟件項目中,存在很多不同類型的窗口。而一個優秀的專業軟件,在工程管理方面,應該能夠在打開一個舊的工程時,自動恢復該工程關閉時的所有信息。然而,由于實現的難度大,許多專業軟件都沒有這一功能,用戶在打開一個工程后,往往還要手動調整以恢復到需要的操作狀態,這給用戶帶來極大不便。

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

1、MFC文檔管理解析

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

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

圖2示出了MFC多文檔管理方法。MFC文檔視圖結構的應用程序類CWinApp可以包含多個文檔模板對象,MFC通過文檔模板管理類CDocManager對這些文檔模板對象進行管理。文檔模板管理類中包含一個鏈表CPtrList m_templateList,用于保存程序中加入的文檔模板類對象。

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

void AddDocTemplate(CDocTemplate* pTemplate);

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

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

MFC通過文檔模板管理類,文檔模板類,文檔這三層關系緊密結合,有機地管理著程序中的文檔。

基于以上MFC文檔視圖結構及其多文檔管理方法,我們設計出以下一套窗口Z坐標的保存與恢復算法。本算法把窗口信息保存在與之相對應的文檔中,將視圖類與框架類結合,處理窗口操作信息。

2、窗口Z坐標的提取與保存

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

消息WM_GETWNDPOS的處理函數是OnGetWndPos,它接收一個有效參數wParam,用于計算窗口的坐標z。消息處理算法流程圖如圖3所示。

2.1算法解析

消息WM_GETWNDPOS傳遞參數wParam,通過在各個窗口之間傳遞,可逐一得到各窗口Z坐標。以下是結合圖3對該算法的解析,其中的關鍵點如取頂層窗口的方法等在算法實現部分給出。

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

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

通過以上算法,得到窗口的Z坐標,然后將數據保存到文檔,并進一步保存到文件中,為窗口恢復準備數據。

2.2算法實現

2.2.1取頂層窗口

頂層窗口就是當前處于激活狀態的窗口,處于所有窗口的頂層。它代表著當前活動的文檔、框架和視圖,可以通過取主框架窗口類的活動框架,然后進一步取其活動視圖來得到。在MFC中可以用標準方法GetActiveFrame和GetActiveView分別實現。

2.2.2取下一窗口的方法

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

2.2.3發進消息

Windows通過消息實現窗口之間數據的傳遞。向窗口發送消息,用Windows API函數SendMessage,其原型如下:

LRESULT SendMessage(HWND hWnd,UINT Msg,

WPARAM wParam,LPARAM IParam);

hWnd為消息目標窗口句柄。Msg為要發送的消息。wParam,IParam為消息參數。

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

3、窗口Z坐標的恢復方法

窗口Z坐標的恢復,即是在所需窗口全部打開后,根據工程文件中保存的Z坐標數據,調整窗口的前后位置至工程保存前的狀態。

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

3.1算法解析

Z坐標恢復過程可以選擇在任意一窗口啟動,為方便起見,這里取頂層窗口。

算法開始,從文件中讀取Z坐標z并賦予臨時坐標zT,對zT進行處理,從而防止改變坐標z,然后移動窗口。進一步計算消息路由條件。如果消息應該繼續路由,則向路由方向上的下一窗口路由消息;如果不再滿足路由條件,則退出算法,也同時結束了Z坐標的恢復過程。

3.2算法實現

3.2.1創建所有窗口

Z坐標恢復的前提是所有窗口已經創建。而要創建一個窗口,只需有這個窗口的類型,也就是知道文檔模板類對象,然后通過CDocTemplate:OpenDocumentFile函數來打開一個文檔,并同時創建窗口。

3.2.2移動窗口

移動窗口,包括移動窗口的位置,控制窗口的大小以及改變窗口的z坐標。這里主要控制窗口的Z坐標。可使用CWnd類的SetWindowPos函數,原型為:

BOOL SetWindowPos(const CWnd*pWndlnsertAfter,int x,

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

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

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

3.2.3路由條件

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

路由條件計算方法:通過zT

4、算法復雜度

窗口z坐標的提取算法:

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

窗口z坐標的恢復算法:

每一個窗口的臨時坐標zT根據z自減至0時算法即結束。其復雜度為:

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

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

5、結束語

窗口Z坐標的提取、保存與恢復是實現大型專業軟件項目工程保存與恢復的關鍵技術,處理了Z坐標,就可以進一步完成整個項目工程的保存與恢復了。本算法基于MFC,以較低的復雜度實現了窗口Z坐標的快速恢復,具有很好的實用價值。同時,本算法具有很強的通用性,可以輕松地應用到任何基于MFC的軟件。

該算法已在3G移動通信路測軟件項目中成功使用。

主站蜘蛛池模板: 亚洲二区视频| 欧美a在线| 国产免费黄| 亚洲国产中文综合专区在| 久久精品视频一| 国产精品亚欧美一区二区三区| 色视频国产| 992tv国产人成在线观看| 国产精品美女自慰喷水| 1024你懂的国产精品| 色妞www精品视频一级下载| www中文字幕在线观看| 国产精品太粉嫩高中在线观看 | 野花国产精品入口| 国产成人精品男人的天堂下载 | 欧美一级专区免费大片| 国外欧美一区另类中文字幕| 毛片最新网址| 一级一级特黄女人精品毛片| 亚洲色图另类| www.99在线观看| 国产精品福利导航| 一本综合久久| 亚洲综合第一区| 伊人蕉久影院| 日本亚洲最大的色成网站www| 久久久久久尹人网香蕉| 99久久国产综合精品女同| 国产精品自在线天天看片| 久久久久无码精品国产免费| 一级爱做片免费观看久久| 永久免费av网站可以直接看的| 51国产偷自视频区视频手机观看 | 亚洲人成网站18禁动漫无码| 成人在线不卡视频| 国产精品原创不卡在线| 毛片基地美国正在播放亚洲| 黄色成年视频| 老司国产精品视频91| 亚洲国产天堂久久九九九| 操美女免费网站| 国产一区二区视频在线| 色综合五月婷婷| 成人在线天堂| 最新无码专区超级碰碰碰| 国产成人区在线观看视频| 狠狠干综合| 日韩欧美一区在线观看| 国产国产人成免费视频77777| 成年免费在线观看| 亚洲人成高清| 亚洲色图综合在线| 日本欧美精品| 国产精品午夜福利麻豆| 国产区福利小视频在线观看尤物| 亚洲三级成人| 国产久操视频| 久久综合色88| 久久亚洲国产最新网站| 国产91视频观看| 精品人妻AV区| 91蜜芽尤物福利在线观看| 成人国产精品视频频| 一级爆乳无码av| 国产精品亚欧美一区二区| a毛片在线播放| 亚洲伊人久久精品影院| 国产精品无码作爱| 538国产视频| 欧美日韩一区二区三区四区在线观看 | 亚洲天堂网在线播放| 萌白酱国产一区二区| 97精品伊人久久大香线蕉| a级毛片在线免费观看| 一区二区三区四区精品视频 | 亚洲人成亚洲精品| 欧美午夜在线观看| 又爽又黄又无遮挡网站| 91精品久久久久久无码人妻| 67194在线午夜亚洲| 久久黄色影院| 欧美不卡视频在线观看|