放大鏡的設(shè)計(jì)與實(shí)現(xiàn)方案_第1頁(yè)
放大鏡的設(shè)計(jì)與實(shí)現(xiàn)方案_第2頁(yè)
放大鏡的設(shè)計(jì)與實(shí)現(xiàn)方案_第3頁(yè)
放大鏡的設(shè)計(jì)與實(shí)現(xiàn)方案_第4頁(yè)
放大鏡的設(shè)計(jì)與實(shí)現(xiàn)方案_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、放大鏡的設(shè)計(jì)與實(shí)現(xiàn)方案放大鏡的設(shè)計(jì)與實(shí)現(xiàn)方案摘 要本方案描述了由C+開(kāi)發(fā)的放大鏡軟件的設(shè)計(jì)與實(shí)現(xiàn),介紹了軟件研究的技術(shù)要求,并對(duì)開(kāi)發(fā)該軟件的目的、開(kāi)發(fā)環(huán)境與平臺(tái)、設(shè)計(jì)理念與軟件功能進(jìn)行了描述。該方案設(shè)計(jì)具體詳細(xì)的闡述了方案的可行性、課題選擇的意義、方案的設(shè)計(jì)方式、實(shí)現(xiàn)邏輯、軟件運(yùn)作流程、界面的設(shè)計(jì)、程序的設(shè)計(jì)等。其中,界面設(shè)計(jì)包括被放大鏡的窗口設(shè)計(jì)以及被放大區(qū)域的計(jì)算方式,程序設(shè)計(jì)包括總體流程設(shè)計(jì)、放大鏡窗體設(shè)計(jì)、消息循環(huán)設(shè)計(jì)、以及窗口美化設(shè)計(jì)。此外還對(duì)代碼的實(shí)現(xiàn)進(jìn)行了介紹,主要包括放大窗口設(shè)計(jì)模塊、圖像采集模塊設(shè)計(jì)、消息循環(huán)模塊以及放大窗口美化模塊。最后對(duì)放大鏡軟件進(jìn)行了功能測(cè)試,并對(duì)測(cè)試結(jié)

2、果進(jìn)行總結(jié)。讀者通過(guò)閱讀本文,將對(duì)該軟件有一個(gè)系統(tǒng)的了解。關(guān)鍵詞 程序設(shè)計(jì);放大鏡;C+ ;APIDesign and implementation of a magnifying glassAbstractThis scenario describes the design and implementation of C + software development magnifying glass, introduces the technical requirements for software research and development purpose of the softw

3、are development environment and platform design and software features are described.The program specifically designed in detail the feasibility of the program ,meaning the subject choice, the way the program design, implementation logic, software, operational processes, interface design ,program des

4、ign .Among them, the interface design, including calculation is a magnifying glass window design and the area is enlarged, the overall program design, including process design, magnifying glass form design, the message loop design, landscaping and window design. In addition,the realization of the co

5、de were introduced, including the zoom window design module, image acquisition module design,module and zoom windows message loop beautification module.Finally magnifier software for functional testing, and test results are summarized. By reading this article the reader will understand the software

6、has a system.Keywords programming;magnifying; C + +; APIii目 錄摘 要iAbstractii1 緒論11.1 課題選擇的目的和意義11.2 國(guó)內(nèi)外研究現(xiàn)狀及發(fā)展趨勢(shì)11.3 研究范圍21.4 技術(shù)要求32 軟件描述42.1 任務(wù)概述42.1.1 系統(tǒng)目標(biāo)42.1.2 系統(tǒng)的開(kāi)發(fā)環(huán)境42.1.3 開(kāi)發(fā)思想與原理42.2 功能描述52.2.1 軟件設(shè)計(jì)52.2.2 模塊功能劃分52.3 性能53 方案設(shè)計(jì)63.1 具體方案設(shè)計(jì)63.1.1模塊劃分63.1.2各個(gè)模塊的功能說(shuō)明63.2 方案論證分析73.2.1 方案的技術(shù)可行性73.2.2

7、方案的經(jīng)濟(jì)可行性83.2.3 方案的優(yōu)點(diǎn)93.3 程序設(shè)計(jì)93.3.1 總體流程94 代碼實(shí)現(xiàn)104.1 主程序入口104.2 放大窗口模塊124.3 圖像采集模塊134.4 消息循環(huán)模塊164.5 放大窗口優(yōu)化模塊194.6 自定義函數(shù)195 測(cè)試205.1 測(cè)試205.1.1 功能測(cè)試205.1.2 性能測(cè)試206 結(jié)論21參考文獻(xiàn)22附錄1 程序運(yùn)行結(jié)果及算法247.1 運(yùn)行結(jié)果247.2 算法26附錄2 名詞解釋28外文原文30中文翻譯411 緒論1.1 課題選擇的目的和意義隨著社會(huì)科技的進(jìn)步以及計(jì)算機(jī)的普及,老年人與殘疾人使用計(jì)算機(jī)已經(jīng)成為一種潮流并且日益普遍。由于生理原因,大部分的

8、老年人都有一些視力障礙,而部分殘疾人也在視力方面有不足的地方。雖然現(xiàn)在Windows系統(tǒng)擁有語(yǔ)音系統(tǒng)來(lái)幫助用戶與計(jì)算機(jī)進(jìn)行交互,但是漢語(yǔ)文化博大精深,這使得Windows的字庫(kù)并不完善。這便導(dǎo)致語(yǔ)音識(shí)別軟件的識(shí)別模糊度很大,如果碰到一些生僻字,回饋的信息便也不是特別準(zhǔn)確,加大了語(yǔ)音系統(tǒng)的局限性。同時(shí),隨著計(jì)算機(jī)存儲(chǔ)空間的增大,個(gè)人PC上安裝的軟件也越來(lái)越多,雖然桌面圖標(biāo)可以進(jìn)行縮小,也可以創(chuàng)建文件夾來(lái)集體管理快捷方式,但是固定大小的桌面畢竟無(wú)法滿足日益增多的快捷方式的存在,這給用戶帶來(lái)了很大的不便。在這樣的背景之下,編寫一個(gè)精簡(jiǎn)的放大鏡軟件,使得用戶可以針對(duì)性的放大所想要看到的區(qū)域與內(nèi)容,便是

9、一種極好的解決方案。如果用戶擁有一個(gè)放大鏡軟件,那便可以將桌面的分辨率提高,在需要的時(shí)候開(kāi)啟放大鏡,將無(wú)法輕易辨識(shí)的內(nèi)容區(qū)域放大顯示即可。在熟練掌握自身編程技術(shù)的基礎(chǔ)之上,幫助人們?nèi)ソ鉀Q一些現(xiàn)實(shí)生活中遇到的問(wèn)題,是一個(gè)畢業(yè)設(shè)計(jì)所能達(dá)到的最出色的狀態(tài)。所以,我希望借助此次畢業(yè)設(shè)計(jì)的機(jī)會(huì),利用自身的知識(shí)與能力,完成一個(gè)放大鏡軟件的設(shè)計(jì)與實(shí)現(xiàn),界面簡(jiǎn)潔,功能完善。1.2 國(guó)內(nèi)外研究現(xiàn)狀及發(fā)展趨勢(shì)嚴(yán)格來(lái)講,放大鏡軟件在當(dāng)前的軟件發(fā)展路程上并不是一個(gè)起眼的角色,很多時(shí)候這個(gè)軟件并不被人們所需要,即其需求量幾乎為零。所以放大鏡軟件也無(wú)從談起研究現(xiàn)狀與發(fā)展趨勢(shì)。但是很多時(shí)候因?yàn)楣ぷ鞯男枰藗円残枰玫椒糯?/p>

10、鏡,譬如在一些精微制圖過(guò)程中,因?yàn)閳D紙過(guò)大,固定的屏幕使得尺寸顯示數(shù)字過(guò)小,這便使得用戶陷入一種尷尬的境地。Windows系統(tǒng)擁有自帶的放大鏡軟件,但是其有幾個(gè)比較突出的缺點(diǎn)。一、放大效果并不是特別平滑,并且放大之后的圖像會(huì)產(chǎn)生失真。二、用戶必須通過(guò)手動(dòng)點(diǎn)擊的方式來(lái)改變軟件的放大倍率。三、放大窗口設(shè)計(jì)不合理且不可根據(jù)用戶當(dāng)前鼠標(biāo)所在方位自動(dòng)移動(dòng),這使得用戶必須手動(dòng)移動(dòng)放大窗口,才能更好的查看被窗口所阻擋的區(qū)域。Windows的放大鏡軟件擁有三種放大方式:全屏,鏡頭,與??俊H翣顟B(tài)下用戶的整個(gè)界面均被放大,此時(shí)用戶可以通過(guò)隨意的移動(dòng)鼠標(biāo)來(lái)尋找內(nèi)容或改變放大倍率,但是該狀態(tài)下最大的缺點(diǎn)就是鼠標(biāo)卷

11、動(dòng)速度過(guò)快以及用戶必須手動(dòng)改變放大倍率。通過(guò)使用發(fā)現(xiàn),當(dāng)放大倍率過(guò)高時(shí),用戶很難快速準(zhǔn)確的尋找到自己想要查看的區(qū)域。鏡頭狀態(tài)下,用戶可以查看鼠標(biāo)當(dāng)前所在區(qū)域的內(nèi)容,但是該狀態(tài)最大的缺點(diǎn)就是放大窗口在內(nèi)容之上,這使得放大窗口直接遮擋了用戶想要查看的區(qū)域,一方面來(lái)講,雖然實(shí)現(xiàn)了放大窗口跟隨鼠標(biāo)的效果,使得用戶可以通過(guò)窗口進(jìn)行目標(biāo)區(qū)域內(nèi)容的查看,但是另一方面,這使得用戶不能快速的了解當(dāng)前鼠標(biāo)所在區(qū)域的具體情況,僅僅只是得到鼠標(biāo)所在的部分區(qū)域的內(nèi)容。??繝顟B(tài)是該軟件最好的使用狀態(tài),但是該狀態(tài)依然存在缺點(diǎn)便是放大窗口不可根據(jù)鼠標(biāo)所在位置自動(dòng)移動(dòng),這會(huì)導(dǎo)致鼠標(biāo)移動(dòng)到窗口內(nèi)部時(shí),窗口遮擋被放大區(qū)域的內(nèi)容,此

12、時(shí)產(chǎn)生的效果便為鏡頭狀態(tài)下的效果,依然存在不足的地方。Linux系統(tǒng)下也有放大鏡軟件,但是大部分都存在放大模糊的效果,即圖像失真,甚至部分軟件為了達(dá)到美化的地步,將放大窗口圓框化,圓框化對(duì)比方框化,最大的區(qū)別便是圓框化下被放大區(qū)域的算法更加繁復(fù),這就會(huì)導(dǎo)致放大窗口邊緣經(jīng)常會(huì)出現(xiàn)文字扭曲的情況,完全不能達(dá)到一個(gè)正常的放大鏡軟件的使用標(biāo)準(zhǔn)。由上文我們可以看出,從私人用戶的角度來(lái)講,放大鏡是一個(gè)可有可無(wú)的軟件,即使需要時(shí),用自帶的軟件也可以勉強(qiáng)使用,這便導(dǎo)致當(dāng)前網(wǎng)絡(luò)上的放大鏡軟件編寫水平粗糙,放大效果不理想。隨著我國(guó)工業(yè)化的進(jìn)步以及現(xiàn)代化科學(xué)技術(shù)的快速發(fā)展,放大鏡在工業(yè)領(lǐng)域的使用則是愈加頻繁。從機(jī)械

13、制造角度來(lái)講,船舶工藝與飛行工藝鑄造的精度可達(dá)0.01mm,而人眼的識(shí)別能力在這一精度下就略顯吃力,若是將放大鏡軟件與工業(yè)硬件相結(jié)合,將其制作為工業(yè)用放大鏡軟件,便可達(dá)到更高的識(shí)別精度。這一思想當(dāng)前在全世界已有實(shí)例,當(dāng)前市場(chǎng)上800倍的光釬放大鏡便是極好的證明。工業(yè)用放大鏡的發(fā)展迅速有兩方面的原因,一方面是隨著工業(yè)技術(shù)的提高零件精度的提高需要更高精度的識(shí)別器,另一方面,硬件的發(fā)展節(jié)奏快于軟件的發(fā)展節(jié)奏,這就使得工業(yè)用放大鏡的硬件水平提高帶動(dòng)了整個(gè)產(chǎn)品的發(fā)展速度,而隨著科學(xué)技術(shù)的發(fā)展,軟件制作水平與放大精度也在進(jìn)步,兩者結(jié)合,便可達(dá)到更高的水平。所以從另一方面來(lái)講,放大鏡軟件是具有發(fā)展前景的。1

14、.3 研究范圍該軟件劃分為四個(gè)模塊:放大窗口設(shè)計(jì)模塊、圖像采集模塊設(shè)計(jì)、消息循環(huán)模塊以及放大窗口優(yōu)化模塊。圖像采集模塊:該模塊為放大鏡軟件的主要模塊之一,其主要功能是通過(guò)一系列函數(shù)與方法獲取被放大區(qū)域,然后將得到的數(shù)據(jù)作為數(shù)據(jù)源發(fā)送至放大窗口設(shè)計(jì)模塊,從而實(shí)現(xiàn)放大的功能。實(shí)現(xiàn)思想:利用Windows API 獲取當(dāng)前鼠標(biāo)所在區(qū)域,通過(guò)鼠標(biāo)位置以及計(jì)算算式,獲取被放大區(qū)域,然后將獲取的矩形內(nèi)的圖像數(shù)據(jù),作為放大窗口的數(shù)據(jù)源輸入。同時(shí)引入MFC庫(kù),將采集到的數(shù)據(jù)通過(guò)StretchBlt()函數(shù),復(fù)制至目標(biāo)窗口,實(shí)現(xiàn)放大的功能。消息循環(huán)模塊:該模塊的主要功能是決定程序的執(zhí)行代碼,根據(jù)用戶的操作來(lái)獲取

15、相對(duì)應(yīng)的虛擬信息并進(jìn)行轉(zhuǎn)換,然后將消息發(fā)送至放大窗口,從而改變放大窗口的各項(xiàng)值。實(shí)現(xiàn)思想:在程序內(nèi)部以函數(shù)的形式定義一個(gè)定時(shí)器并實(shí)現(xiàn),在主程序內(nèi)不斷讀取消息并對(duì)放大窗口進(jìn)行操作,定時(shí)器定期監(jiān)控虛擬信息,將其進(jìn)行轉(zhuǎn)換后獲得信息輸入然后將其發(fā)送至指定窗口,通過(guò)switch.case語(yǔ)句分析信息輸入,然后選擇性的進(jìn)行目標(biāo)代碼的運(yùn)行。放大窗口設(shè)計(jì)模塊:該模塊為放大鏡的主要模塊之一,其主要功能是創(chuàng)建一個(gè)窗口作為放大窗口,然后將圖像采集模塊獲得的數(shù)據(jù)作為數(shù)據(jù)輸入并顯示,同時(shí)通過(guò)消息循環(huán)模塊所發(fā)送的消息來(lái)決定放大窗口的各項(xiàng)屬性。實(shí)現(xiàn)思想:事先通過(guò)定義或者計(jì)算得到各個(gè)變量的值,之后將獲取到的變量置于Creat

16、eWindow()函數(shù)之中,創(chuàng)建窗口,所創(chuàng)建的矩形為查看窗口,即放大窗口。同時(shí)可通過(guò)鍵盤以及鼠標(biāo),對(duì)目標(biāo)矩形進(jìn)行窗口大小和倍率的修改。放大窗口優(yōu)化模塊:該模塊是放大窗口設(shè)計(jì)模塊的附屬模塊,其目的是在放大窗口正常運(yùn)行的情況下,對(duì)放大窗口進(jìn)行一些優(yōu)化操作,提高用戶的使用體驗(yàn)感。通過(guò)各種MFC預(yù)設(shè)函數(shù),在目標(biāo)窗口內(nèi)進(jìn)行畫線等操作,使得通過(guò)人為的程序設(shè)計(jì),實(shí)現(xiàn)前端窗口可以達(dá)到提高用戶體驗(yàn)的效果。目前已在放大窗口內(nèi)加入了兩條交叉紅線使得使用者可通過(guò)紅線的交叉點(diǎn)確定鼠標(biāo)位置,利用此舉使得用戶可以判斷當(dāng)前鼠標(biāo)位置,更好的得到自己想要的信息。1.4 技術(shù)要求(1)該程序設(shè)計(jì)為Windows桌面應(yīng)用程序,可運(yùn)行

17、在Windows XP 及以上版本的Windows操作系統(tǒng)上。(2)合理劃分各功能模塊。(3)調(diào)用Windows API實(shí)現(xiàn)與操作系統(tǒng)的數(shù)據(jù)交互。2 軟件描述2.1 任務(wù)概述下面我將該課程設(shè)計(jì)的有關(guān)問(wèn)題簡(jiǎn)要描述一下2.1.1 系統(tǒng)目標(biāo)該放大鏡軟件可放大屏幕上當(dāng)前鼠標(biāo)所在位置周圍一定區(qū)域的數(shù)據(jù),方便用戶進(jìn)行查看不易辨別的區(qū)域。去除原規(guī)劃的設(shè)置界面,加入鍵盤消息監(jiān)控代碼,使得該區(qū)域的大小可由用戶通過(guò)鍵盤操作自行設(shè)定。對(duì)區(qū)域的邊界進(jìn)行閥值設(shè)定,防止用戶過(guò)大或過(guò)小的設(shè)定窗口大小。同時(shí)對(duì)被放大區(qū)域的邊界進(jìn)行判定,當(dāng)被放大區(qū)域超出Windows邊界時(shí)根據(jù)鼠標(biāo)所在位置的情況重新設(shè)定窗口大小。同時(shí)可在用戶鼠標(biāo)

18、移向放大區(qū)域時(shí)改變放大區(qū)域的位置,使得用戶可以達(dá)到查看全屏區(qū)域的效果。對(duì)被放大區(qū)域與放大窗口的位置進(jìn)行判定防止兩者重疊產(chǎn)生重復(fù)放大的情況。同時(shí)用戶可使用鼠標(biāo)的滾輪設(shè)定軟件的放大倍率。去除原規(guī)劃的設(shè)置界面,直接修改為利用鼠標(biāo)控制倍率的調(diào)整,提高用戶的使用體驗(yàn)感。通過(guò)測(cè)試對(duì)倍率的閥值進(jìn)行設(shè)定,防止用戶過(guò)大或過(guò)小的調(diào)整倍率。在放大窗口內(nèi)加入紅色線條,交點(diǎn)代表當(dāng)前鼠標(biāo)所在位置,使得用戶可以快速的尋找到目標(biāo)位置與目標(biāo)數(shù)據(jù),提高用戶的使用體驗(yàn)感。2.1.2 系統(tǒng)的開(kāi)發(fā)環(huán)境硬件:硬盤空間:5G內(nèi)存:1GCPU:奔騰三代操作系統(tǒng):Windows XP 或以上其他軟件:Microsoft Visual Stud

19、io 2008 或以上2.1.3 開(kāi)發(fā)思想與原理放大鏡軟件實(shí)現(xiàn)的基礎(chǔ)功能是放大鼠標(biāo)所在區(qū)域并可通過(guò)鍵盤與鼠標(biāo)對(duì)放大鏡的各項(xiàng)屬性進(jìn)行更改。放大鏡軟件實(shí)現(xiàn)思想是首先對(duì)鼠標(biāo)所在區(qū)域通過(guò)計(jì)算,然后進(jìn)行被放大區(qū)域的抓取,將圖形獲取并放在緩存之中,通過(guò)StretchBlt()將數(shù)據(jù)復(fù)制至目標(biāo)區(qū)域,變相實(shí)現(xiàn)將圖像放大的效果。如果想實(shí)現(xiàn)縮小的效果,只需修改想要抓取區(qū)域的大小以及計(jì)算方式即可。在這個(gè)過(guò)程中我們可以定義一個(gè)定時(shí)器不斷的監(jiān)控虛擬信息輸入,然后通過(guò)轉(zhuǎn)換后判斷當(dāng)前用戶的動(dòng)作或輸入,從而通過(guò)函數(shù)判定來(lái)選擇目標(biāo)代碼的執(zhí)行。放大窗口的移動(dòng),軟件的退出,放大區(qū)域的刷新,鼠標(biāo)的移動(dòng),鼠標(biāo)滾輪動(dòng)作,鍵盤輸入決定窗口

20、大小等,均由定時(shí)器進(jìn)行判定輸出信號(hào)。放大鏡軟件的所有動(dòng)作,都是由定時(shí)器模塊與回調(diào)函數(shù)機(jī)制共同來(lái)決定。下面是該軟件中兩個(gè)小算法的思路:計(jì)算抓取區(qū)域與實(shí)現(xiàn)窗口移動(dòng)。如何計(jì)算所要被抓取的區(qū)域:首先通過(guò)GetCursorPos()函數(shù)可獲得鼠標(biāo)位置,然后利用放大窗口所設(shè)定的變量值,即放大窗口大小,除以2再除以放大因數(shù),便可獲得所想要被抓取的區(qū)域。當(dāng)被放大區(qū)域的上下左右邊界到達(dá)屏幕臨界點(diǎn),即被放大區(qū)域即將超出屏幕邊界時(shí),根據(jù)鼠標(biāo)所在位置對(duì)被放大窗口的大小進(jìn)行針對(duì)性設(shè)計(jì),經(jīng)過(guò)計(jì)算后重新修改上下左右邊界的值,便可防止被放大區(qū)域超出屏幕邊界。具體設(shè)計(jì)在之后會(huì)呈現(xiàn)。如何實(shí)現(xiàn)放大窗口的移動(dòng):在程序中設(shè)定一個(gè)定時(shí)器

21、,不斷的監(jiān)控虛擬指令并進(jìn)行轉(zhuǎn)譯,首先通過(guò)ScreenToClient()函數(shù)將鼠標(biāo)所在的位置轉(zhuǎn)化為坐標(biāo)點(diǎn),賦值給m_ptCur變量,然后通過(guò)PtInRect()函數(shù)檢測(cè)鼠標(biāo)是否在放大窗口內(nèi),當(dāng)鼠標(biāo)在放大窗口中時(shí),改變窗口標(biāo)識(shí)變量,通過(guò)SetWindowPos()函數(shù)將窗口位置改變即可。2.2 功能描述2.2.1 軟件設(shè)計(jì)放大鏡軟件可對(duì)鼠標(biāo)位置周圍的部分屏幕區(qū)域進(jìn)行放大,并能根據(jù)鼠標(biāo)所在位置改變放大窗口位置,從而實(shí)現(xiàn)全屏幕無(wú)死角的放大查看。用戶可通過(guò)鍵盤改變放大窗口的大小同時(shí)改變被放大區(qū)域的大小,也可通過(guò)鼠標(biāo)滾輪改變軟件的放大倍率。2.2.2 模塊功能劃分根據(jù)需求分析以及程序設(shè)計(jì)可知,要想完成放

22、大鏡的功能,首先要通過(guò)圖像采集模塊計(jì)算被放大區(qū)域,獲得被放大區(qū)域的數(shù)據(jù),同時(shí)通過(guò)窗口設(shè)計(jì)模塊設(shè)定放大窗口各屬性,創(chuàng)建放大窗口,通過(guò)消息循環(huán)模塊監(jiān)測(cè)虛擬消息,首先默認(rèn)將數(shù)據(jù)復(fù)制至放大窗口,之后不斷監(jiān)測(cè)虛擬消息,轉(zhuǎn)譯、發(fā)送消息到放大窗口,根據(jù)消息類型,選擇性執(zhí)行代碼行,實(shí)現(xiàn)各種功能。最后在軟件成功運(yùn)行的基礎(chǔ)之上優(yōu)化界面顯示,提高用戶的使用體驗(yàn)感。2.3 性能(1)時(shí)間特性更新消息處理時(shí)間:50ms運(yùn)行時(shí)間:人工決定(2)適應(yīng)性:可在Windows XP 或以上版本的Windows操作系統(tǒng)下運(yùn)行(3)其他要求:可使用性:一般用戶均可使用可靠性:較為可靠可維護(hù)性:易于維護(hù)3 方案設(shè)計(jì)3.1 具體方案設(shè)

23、計(jì)下面是關(guān)于此方案的具體設(shè)計(jì):3.1.1模塊劃分根據(jù)該軟件所需要實(shí)現(xiàn)的放大功能,整個(gè)軟件可劃分為四個(gè)模塊:放大窗口設(shè)計(jì)模塊、圖像采集模塊設(shè)計(jì)、消息循環(huán)模塊以及放大窗口優(yōu)化模塊。它們需要完成的任務(wù)是事先設(shè)定放大窗口的大小及位置,創(chuàng)建窗口,抓取鼠標(biāo)所在區(qū)域,采集數(shù)據(jù),將數(shù)據(jù)進(jìn)行復(fù)制,傳送到放大窗口,實(shí)現(xiàn)放大效果,然后不斷監(jiān)控虛擬消息,通過(guò)用戶操作改變放大窗口的各項(xiàng)屬性。在軟件成功運(yùn)行的基礎(chǔ)之上,對(duì)軟件進(jìn)行細(xì)小優(yōu)化,提高用戶的使用體驗(yàn)。3.1.2各個(gè)模塊的功能說(shuō)明3.1.2.1 放大窗口設(shè)計(jì)模塊放大窗口模塊用于將得到的圖形數(shù)據(jù)進(jìn)行投影,讓用戶清楚當(dāng)前鼠標(biāo)所在區(qū)域的圖像,從而使得用戶可以選擇性的進(jìn)行放

24、大區(qū)域的選擇,達(dá)到放大鏡的目的。同時(shí)還在窗口位置設(shè)定模塊中,加入了之后的消息判斷,從而可以實(shí)現(xiàn)利用鼠標(biāo)位置判定來(lái)移動(dòng)當(dāng)前顯示窗口的功能。整個(gè)窗口放大模塊,分為兩個(gè)小模塊:創(chuàng)建窗口與窗口移動(dòng)。創(chuàng)建窗口模塊最主要使用的函數(shù)為CreateWindow()函數(shù),該函數(shù)共有11個(gè)變量,這些變量共同決定了窗口的類型,所在位置,類名,標(biāo)題,風(fēng)格等屬性,所以只需要在程序內(nèi)部定義各個(gè)變量及其屬性值,便可利用該函數(shù)進(jìn)行窗口的創(chuàng)建。在窗口進(jìn)行創(chuàng)建后,要進(jìn)行激活,重新顯示,這樣可以保證窗口創(chuàng)建的成功性。窗口移動(dòng)模塊則是放大窗口模塊與之后的消息循環(huán)模塊相互關(guān)聯(lián),兩者共同協(xié)作達(dá)到移動(dòng)窗口的目的。通過(guò)消息循環(huán)模塊不斷發(fā)出的

25、消息來(lái)判斷執(zhí)行語(yǔ)句,當(dāng)鼠標(biāo)在目標(biāo)窗口內(nèi)時(shí),使用自定義函數(shù)SetWndPos(),內(nèi)部使用SetWindowPos()函數(shù),該函數(shù)共有7個(gè)變量,共同改變指定窗口當(dāng)前狀態(tài)。這7個(gè)變量,有定義的固定變量,也有經(jīng)過(guò)計(jì)算后得到的變量,其作用是改變當(dāng)前窗口狀態(tài),這樣使用自定義函數(shù)去決定當(dāng)前窗口的新?tīng)顟B(tài),便可達(dá)到使窗口移動(dòng)的效果。該模塊的具體設(shè)計(jì)以及各函數(shù)解釋會(huì)在之后代碼設(shè)計(jì)中進(jìn)行描述。3.1.2.2 圖像采集模塊設(shè)計(jì)圖形采集模塊是放大鏡軟件最重要的模塊之一,該模塊利用Windows API獲取當(dāng)前屏幕的圖像數(shù)據(jù)。同時(shí)將所獲取到的數(shù)據(jù)復(fù)制至放大窗口設(shè)計(jì)模塊中所設(shè)置的窗口。而該模塊使用的函數(shù)StretchBl

26、t(),也是放大鏡軟件最重要的一個(gè)函數(shù),當(dāng)前Windows系統(tǒng)之上大部分的放大鏡軟件,均是在該函數(shù)的基礎(chǔ)上進(jìn)行優(yōu)化來(lái)編寫放大鏡軟件。StretchBlt()函數(shù)共有10個(gè)變量,其中第一個(gè)變量為目標(biāo)環(huán)境句柄,在放大鏡軟件中,該變量代表放大窗口的句柄,這個(gè)是在全局變量中進(jìn)行定義,之后的四個(gè)變量共同決定放大窗口所在的位置,它們由放大窗口的左邊界,放大窗口的上邊界,放大窗口的寬,放大窗口的高度共同決定。第五個(gè)變量為被放大窗口的句柄,6-9代表被放大窗口的大小,這些跟放大窗口的設(shè)定都有異曲同工之處。第十個(gè)變量則為數(shù)據(jù)的映射方式。在該程序設(shè)計(jì)中,我選擇直接使用SRCCOPY,它所代表的含義是將源矩形區(qū)域直

27、接拷貝到目標(biāo)矩形區(qū)域。因?yàn)樵摵瘮?shù)是不斷的將數(shù)據(jù)放入內(nèi)存然后再拷貝至放大窗口,在消息循環(huán)模塊我們可知道信息是不斷的監(jiān)測(cè),這代表窗口如果不進(jìn)行資源釋放,那么內(nèi)存會(huì)不斷的被占用,所以在圖像采集模塊的最后,我們需要加入ReleaseDC()函數(shù),將得到的信息全部釋放,即釋放窗口資源,這樣才能保證軟件長(zhǎng)久運(yùn)行的穩(wěn)定性。3.1.2.3 消息循環(huán)模塊消息循環(huán)模塊是放大鏡軟件的另一個(gè)重要部分。如果說(shuō)圖像采集模塊是放大鏡軟件的執(zhí)行者,那么消息循環(huán)模塊就是放大鏡軟件的決策者。在消息循環(huán)模塊中,我定義并實(shí)現(xiàn)了一個(gè)定時(shí)器函數(shù),這個(gè)函數(shù)每50ms會(huì)讀取一次虛擬消息,然后對(duì)虛擬消息進(jìn)行轉(zhuǎn)化,選擇性的去執(zhí)行各個(gè)代碼行,從另

28、一個(gè)角度來(lái)講,該定時(shí)器每50ms便會(huì)執(zhí)行一次相應(yīng)的代碼,譬如鼠標(biāo)移動(dòng),就會(huì)去執(zhí)行Case WM_MOUSEMOVE之后的代碼行,創(chuàng)建窗口,就會(huì)去執(zhí)行Case WM_CREATE之后的代碼行等。如同之前在放大窗口設(shè)計(jì)模塊中所述,放大窗口模塊就是用于將得到的圖形數(shù)據(jù)進(jìn)行投影,然后達(dá)到放大的效果。其實(shí)整個(gè)放大的過(guò)程,就是消息循環(huán)模塊,放大窗口設(shè)計(jì)模塊,與圖像采集模塊工作協(xié)作的結(jié)果。WM_TIMER是定時(shí)器的默認(rèn)消息,當(dāng)定時(shí)器監(jiān)測(cè)到無(wú)其他消息時(shí),便會(huì)默認(rèn)執(zhí)行WM_TIMER所代表的代碼行,將圖像采集模塊與窗口優(yōu)化模塊均寫在這個(gè)函數(shù)中,那么程序便可以實(shí)現(xiàn)放大功能,并且因?yàn)橄㈤g隔時(shí)間很短,結(jié)合生物學(xué)的視

29、覺(jué)暫留,我們便可從用戶角度感覺(jué)放大鏡的放大并不粘滯,放大流暢,有很好的用戶體驗(yàn)感。SetTimer()函數(shù)包含四個(gè)變量,他們分別代表接受消息的窗口,定時(shí)器ID,定時(shí)器間隔,以及定時(shí)器消息的處理函數(shù)。一般來(lái)講,我們只需要對(duì)前三者進(jìn)行設(shè)置即可,因?yàn)橹付ù翱谝话愣紩?huì)有消息處理函數(shù),所以第四個(gè)變量一般為NULL。而其余的變量,則需要根據(jù)實(shí)際情況進(jìn)行設(shè)定,譬如該放大鏡軟件的更新消息處理時(shí)間為50ms,我需要讓其50ms更新一次畫面,那么我需要將第三個(gè)變量設(shè)為50即可。3.1.2.4 放大窗口優(yōu)化模塊放大窗口模塊是在整個(gè)放大鏡軟件的主要功能“放大”完成之后,在圖像處理模塊加入的小模塊,它的作用是用簡(jiǎn)單的手

30、段,創(chuàng)建一些額外的畫面或者提示,提高用戶的體驗(yàn)感。目前已經(jīng)實(shí)現(xiàn)的功能有:在放大窗口添加額外的顯示,使得用戶可以得到當(dāng)前鼠標(biāo)所在位置。這一功能使得用戶可以根據(jù)兩條線的交點(diǎn),更加迅速的得到自己鼠標(biāo)的所在位置,從而可以更快的確定放大目標(biāo),以及更快的得到所需消息。MFC有自己的HPEN結(jié)構(gòu)體,利用該結(jié)構(gòu)體以及CreatePen()函數(shù),我們可以創(chuàng)建一個(gè)畫筆,CreatePen()函數(shù)有三個(gè)變量,畫筆風(fēng)格,寬度,以及畫筆顏色。一般畫筆風(fēng)格如無(wú)特殊要求,均使用默認(rèn)風(fēng)格PS_SOLID,顏色,則可以使用預(yù)定義的顏色,或者使用三原色來(lái)確定顏色,例如RGB(255,0,0)便代表紅色。確定畫筆之后,利用Sele

31、ctObject()函數(shù)將所創(chuàng)建的畫筆選至放大窗口,然后在其內(nèi)部使用MoveToEx()以及LineTo()兩個(gè)函數(shù)來(lái)畫線。前者的功能是將點(diǎn)移動(dòng)至目標(biāo)點(diǎn),后者的功能則是從A點(diǎn)畫線至B點(diǎn)。它們都有自己的變量以及函數(shù)使用方法,其具體使用方式將在代碼設(shè)計(jì)中體現(xiàn)并解釋。3.2 方案論證分析3.2.1 方案的技術(shù)可行性C+是在C語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)的一種集面向?qū)ο缶幊?、泛型編程和過(guò)程化編程于一體的編程語(yǔ)言。它在C語(yǔ)言的基礎(chǔ)之上加入了類的概念,派生類,類的多重繼承,抽象類,const成員函數(shù),共有和私有成員,構(gòu)造函數(shù),析構(gòu)函數(shù),友元,內(nèi)聯(lián)函數(shù),賦值運(yùn)算符的重載,虛函數(shù),函數(shù)和運(yùn)算符的重載,引用等。C語(yǔ)言是C+

32、的基礎(chǔ),C+和C語(yǔ)言在很多方面是兼容的。C語(yǔ)言是一個(gè)結(jié)構(gòu)化語(yǔ)言,它的重點(diǎn)在于算法與數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計(jì)首要考慮的是如何通過(guò)一個(gè)過(guò)程,對(duì)輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過(guò)程(事物)控制)。C+則首要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,讓這個(gè)模型能夠契合與之對(duì)應(yīng)的問(wèn)題域,這樣就可以通過(guò)獲取對(duì)象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過(guò)程(事物)控制。所以C語(yǔ)言和C+的最大區(qū)別在于它們解決問(wèn)題的思想方法不一樣。C+語(yǔ)言最有意義的方面是支持面向?qū)ο蟮奶卣?。雖然與C的兼容使得C+具有雙重特點(diǎn),但他在概念上完全與C不同,更具面向?qū)ο蟮奶卣?。而出于保證語(yǔ)言的簡(jiǎn)潔和運(yùn)行高效等方面的考慮,C+的很多特性都是以庫(kù)(如M

33、FC)或其他的形式提供的,而沒(méi)有直接添加到語(yǔ)言本身里。C+引入了面向?qū)ο蟮母拍睿沟瞄_(kāi)發(fā)人機(jī)交互類型的應(yīng)用程序更為簡(jiǎn)單、快捷。很多優(yōu)秀的程序框架包括Boost、Qt、MFC、OWL、wxWidgets、WTL就是使用的C+。MFC(MicrosoftFoundationClasses)是微軟基礎(chǔ)類庫(kù)的簡(jiǎn)稱,是微軟公司實(shí)現(xiàn)的一個(gè)C+類庫(kù),主要封裝了大部分的Windows API函數(shù),VC+是微軟公司開(kāi)發(fā)的C/C+的集成開(kāi)發(fā)環(huán)境,所謂集成開(kāi)發(fā)環(huán)境,就是說(shuō)利用它你可以編輯,編譯,調(diào)試,而不是使用多種工具輪換操作,靈活性較大。MFC除了是一個(gè)類庫(kù)以外,還是一個(gè)框架,并且MFC提供了大量的窗口類,其功能

34、和用途各異。所以使用C+語(yǔ)言,引入MFC類庫(kù),能夠書寫更簡(jiǎn)潔的代碼,擁有更快速的開(kāi)發(fā)速度,省卻了在C+語(yǔ)言中再寫入窗口以及框架的時(shí)間。并且利用C+語(yǔ)言進(jìn)行開(kāi)發(fā),不需要犧牲任何C語(yǔ)言的特點(diǎn),從另一方面來(lái)講,C+在C語(yǔ)言的基礎(chǔ)上重新開(kāi)發(fā),熟悉C開(kāi)發(fā)的人員也能更快地進(jìn)入C+領(lǐng)域,只需要一個(gè)MFC幫助文檔并且了解MFC的運(yùn)行機(jī)制,便能更快的進(jìn)行基于C+和MFC框架的程序開(kāi)發(fā)。同時(shí)該軟件由VS2010進(jìn)行編譯,運(yùn)行在Windows操作系統(tǒng)上,在程序編寫過(guò)程中,使用Windows所規(guī)定的消息循環(huán)機(jī)制與消息響應(yīng)機(jī)制,同時(shí)使用Windows系統(tǒng)的API與MFC庫(kù),這使得該軟件可以在Windows操作系統(tǒng)上不同

35、的架構(gòu)下進(jìn)行移植并提高了軟件的通用性,這使得軟件的移植性大大提高。所以此方案具有技術(shù)可行性。3.2.2 方案的經(jīng)濟(jì)可行性隨著計(jì)算機(jī)的普及,計(jì)算機(jī)已成為我們不可或缺的物件,與之而來(lái)的各種軟件使用頻率也不斷增加。從目前角度來(lái)看,個(gè)人PC上的放大鏡是一個(gè)可有可無(wú)的軟件,多用于在特殊情況下放大屏幕,得到用戶想要的信息。由于實(shí)際生活問(wèn)題,個(gè)人PC的放大鏡軟件多面向老年人或者殘疾人,使用普及率并不高。所以從私人角度來(lái)講放大鏡的經(jīng)濟(jì)可行性并不高。這也是導(dǎo)致個(gè)人PC放大鏡軟件很少并且編寫粗糙的主要原因。但是結(jié)合當(dāng)前世界工業(yè)發(fā)展情況,我們可以看到,科學(xué)技術(shù)的發(fā)展,使得生產(chǎn)零件精度愈加提高,人眼識(shí)別能力在發(fā)展下已

36、略顯吃力,若是將放大鏡軟件與硬件相結(jié)合,進(jìn)行智能放大鏡與工業(yè)用放大鏡的開(kāi)發(fā),便可在一些特定區(qū)域獲得利益,當(dāng)前市場(chǎng)上的800倍光釬放大鏡已取得極好的收益。投資小,所以經(jīng)濟(jì)可行性尚可。3.2.3 方案的優(yōu)點(diǎn)該放大鏡方案最大的優(yōu)點(diǎn)可從兩方面解讀,一方面是從代碼編寫談微觀方面,一方面是從界面談宏觀方面。在代碼編寫過(guò)程中,該軟件加入了MFC類庫(kù)的引用,這使得軟件代碼簡(jiǎn)短,處理速度快,軟件體積大幅縮小,并且使用switch.case語(yǔ)句使得軟件的邏輯結(jié)構(gòu)非常清晰,軟件的代碼運(yùn)行均是針對(duì)性、選擇性的運(yùn)行,并且內(nèi)含資源優(yōu)化機(jī)制,使得軟件內(nèi)存消耗極小,可保證軟件的長(zhǎng)期運(yùn)行。加入Windows消息循環(huán)機(jī)制使得用戶

37、可以快速理解軟件的運(yùn)行方式與函數(shù)回調(diào)機(jī)制,同時(shí)可以使得長(zhǎng)期使用Windows編程的軟件工程師快速了解軟件的編寫結(jié)構(gòu)與思想,容易實(shí)現(xiàn)軟件的二次開(kāi)發(fā)與維護(hù)。在用戶界面方面來(lái)看,該軟件去除了設(shè)置界面,將放大鏡的設(shè)置全部以熱鍵的形式融合入程序中,省卻了用戶不斷設(shè)置的繁復(fù)。使用熱鍵來(lái)進(jìn)行設(shè)置改變,符合當(dāng)前社會(huì)快速生活的主旨。并且該軟件結(jié)合Windows上放大鏡軟件的三種顯示方式,整個(gè)軟件的窗口顯示為仿??磕J?,窗口默認(rèn)固定在左上角,在運(yùn)行過(guò)程中可以根據(jù)鼠標(biāo)位置來(lái)改變窗口位置,排除了放大窗口擋住被放大部分的缺陷。Windows是當(dāng)前中國(guó)使用率最高的軟件系統(tǒng),開(kāi)發(fā)Windows下的放大鏡軟件,也能滿足大量私

38、人用戶的需求,符合一個(gè)軟件的編寫應(yīng)有利于社會(huì)工作效率提高的宗旨。3.3 程序設(shè)計(jì)3.3.1 總體流程該放大鏡軟件程序從主函數(shù)進(jìn)入,運(yùn)行后先運(yùn)行創(chuàng)建窗口函數(shù),添加WM_CREATE消息至消息隊(duì)列中,執(zhí)行消息循環(huán)模塊,創(chuàng)建窗口,抓取窗口的句柄為之后窗口的各項(xiàng)操作提供變量。然后默認(rèn)執(zhí)行WM_TIMER后的代碼行,即圖像采集模塊,計(jì)算被放大區(qū)域,對(duì)被放大區(qū)域的數(shù)據(jù)進(jìn)行抓取,并將該數(shù)據(jù)直接拷貝到放大窗口。在之后的運(yùn)行過(guò)程中,定時(shí)器循環(huán)監(jiān)測(cè)虛擬消息,對(duì)虛擬消息進(jìn)行轉(zhuǎn)譯并決定執(zhí)行代碼,并返回消息給放大窗口,放大窗口根據(jù)選擇代碼行對(duì)窗口進(jìn)行操作。當(dāng)用戶輸入ESC或者ALT+F4時(shí),觸發(fā)關(guān)閉窗口消息,關(guān)閉窗口,

39、退出程序。其流程如圖3-1所示。圖3-1 放大鏡軟件運(yùn)行總體流程4 代碼實(shí)現(xiàn)放大鏡軟件根據(jù)需求分析以及功能模塊的劃分,來(lái)進(jìn)行代碼的編寫,但是并不是每一個(gè)模塊都有自己絕對(duì)對(duì)應(yīng)的代碼區(qū)域,它們互相組合,譬如圖像抓取模塊就與放大窗口優(yōu)化模塊放在一起,寫在WM_TIMER指令判斷之后,在窗口不斷的重新建立中一起運(yùn)行。各模塊的具體區(qū)域以及含義解讀,將在小章節(jié)劃分,程序的注釋,以及之后的部分代碼解讀中體現(xiàn)。4.1 主程序入口該部分為程序的主入口,即main函數(shù)。從代碼中我們可以看出,程序的運(yùn)行流程為先根據(jù)各變量,聲明并定義窗口類,創(chuàng)建窗口時(shí)獲取窗口句柄,為之后的窗口屬性修改做準(zhǔn)備。創(chuàng)建窗口后為消息循環(huán)模塊

40、,其作用為不斷讀取線程中的消息,處理消息后丟棄消息。消息循環(huán)模塊具體設(shè)計(jì)在之后小章節(jié)中。int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)WNDCLASSEX wcex;/WNDCLASSEX wcex1;/定義windows類wcex.cbSize = sizeof(WNDCLASSEX);wcex.style= CS_CLASSDC;/窗口類型wcex.lpfnWndProc= WndProc;/定義窗口處理函數(shù)wcex.cbClsExtra= 0;/

41、窗口類無(wú)擴(kuò)展wcex.cbWndExtra= 0;/窗口實(shí)例無(wú)擴(kuò)展wcex.hInstance= hInstance;/當(dāng)前實(shí)例句柄wcex.hIcon= NULL;/窗口的最小化圖標(biāo)wcex.hCursor= LoadCursor(NULL, IDC_ARROW);/窗口采用箭頭光標(biāo)wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);/窗口背景色wcex.lpszMenuName= NULL;/窗口菜單wcex.lpszClassName= szWindowClass;/窗口類名wcex.hIconSm= NULL;/窗口的圖標(biāo)縮略圖/wcex1.cbS

42、ize = sizeof(WNDCLASSEX);/wcex1.style= CS_CLASSDC;/wcex1.lpfnWndProc= WndProc;/wcex1.cbClsExtra= 0;/wcex1.cbWndExtra= 0;/wcex1.hInstance= hInstance;/wcex1.hIcon= NULL;/wcex1.hCursor= LoadCursor(NULL, IDC_ARROW);/wcex1.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);/wcex1.lpszMenuName= NULL;/wcex1.lpszClass

43、Name= szWindowClass;/wcex1.hIconSm= NULL;/RegisterClassEx(&wcex1);RegisterClassEx(&wcex);/為之后調(diào)用CreateWindow函數(shù)使用的窗口注冊(cè)一個(gè)窗口類m_hInst = hInstance; / 將實(shí)例句柄存儲(chǔ)在全局變量中m_hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUPWINDOW,m_iWndX, m_iWndY, m_iWndCX, m_iWndCY, NULL, NULL, m_hInst, NULL);/創(chuàng)建windows實(shí)例類名,標(biāo)題

44、,風(fēng)格,初始坐標(biāo),窗口大小,父窗口句柄,菜單句柄,模塊實(shí)例句柄if (!m_hWnd)return FALSE;/創(chuàng)建失敗ShowWindow(m_hWnd, SW_SHOWNORMAL);/窗口句柄,激活并顯示一個(gè)窗口UpdateWindow(m_hWnd);/重繪窗口/ 消息循環(huán)處理MSG msg;ZeroMemory(&msg,sizeof msg);/用填充消息while (msg.message != WM_QUIT)if (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)/API函數(shù)檢查線程消息隊(duì)列/消息讀取后移除TranslateMessage(&m

45、sg);/ 該函數(shù)將虛擬鍵消息轉(zhuǎn)換為字符消息/ 字符消息被寄送到調(diào)用線程的消息隊(duì)列里,當(dāng)下一次線程調(diào)用函數(shù)GetMessage或PeekMessage時(shí)被讀出DispatchMessage(&msg);/該函數(shù)分發(fā)一個(gè)消息給窗口程序elseUnregisterClass(szWindowClass,m_hInst);/銷毀4.2 放大窗口模塊該模塊的實(shí)現(xiàn)邏輯為:首先在主函數(shù)外聲明之后創(chuàng)建窗口所需的全部變量以及過(guò)程函數(shù)的聲明。聲明的變量為之后使用CreateWindow()創(chuàng)建窗口做準(zhǔn)備。CreateWindow()在主程序中,運(yùn)行至CreateWindow()時(shí)向消息隊(duì)列加入WM_CREATE

46、消息,由消息循環(huán)模塊對(duì)消息進(jìn)行讀取,轉(zhuǎn)移,選擇性執(zhí)行代碼。從而達(dá)到創(chuàng)建放大窗口的目的,而不是在執(zhí)行至CreateWindows()時(shí)便創(chuàng)建窗口。#include#define MAX_LOADSTRING 100/全局變量HINSTANCE m_hInst;/ 當(dāng)前實(shí)例,定義的應(yīng)用程序句柄CHAR szTitleMAX_LOADSTRING = Magnifier_Test;/ 應(yīng)用程序的標(biāo)題CHAR szWindowClassMAX_LOADSTRING = Magnifier_Test;/ 主窗口類名HWND m_hWnd;INT m_iWndCX = 300;INT m_iWndCY =

47、 300;/窗口預(yù)設(shè)大小INT m_iWndX = 0;INT m_iWndY = 0;POINT m_ptCur = 0,0;FLOAT m_fMultyValue = 2.0f;/倍率RECT m_rcWnd;/矩形變量CHAR m_cWndType;enum enWndTypeWND_LEFT,/0WND_RIGHT,/1;LRESULT WINAPIWndProc(HWND, UINT, WPARAM, LPARAM);/過(guò)程函數(shù)switch (message)case WM_CREATE:m_hWnd = hWnd;SetTimer(hWnd,0,50,NULL);/接受消息的窗口,

48、定時(shí)器,定時(shí)器時(shí)間間隔,定時(shí)器消息的處理函數(shù),如果為NULL,則由指定的窗口的消息處理函數(shù)來(lái)處理/m_iWndX = 0;/m_iWndY = 0;GetWindowRect(hWnd,&m_rcWnd);m_cWndType = WND_LEFT;SetWndPos();break;4.3 圖像采集模塊圖像采集模塊位于創(chuàng)建窗口,即消息循環(huán)模塊讀取WM_CREATE之后,執(zhí)行定時(shí)器機(jī)制默認(rèn)的消息WM_TIMER中。聯(lián)系Windows消息系統(tǒng)可知,對(duì)放大窗口進(jìn)行操作需要窗口的句柄,該句柄已在放大窗口模塊創(chuàng)建放大窗口時(shí)被得到。關(guān)于被抓取區(qū)域的大小,需要根據(jù)鼠標(biāo)位置以及放大窗口的大小來(lái)共同計(jì)算,在正

49、常情況下被抓取區(qū)域?yàn)椋阂允髽?biāo)位置為中心,經(jīng)過(guò)與倍率相除之后的放大窗口。非正常情況包括四種情況:上界限超出屏幕邊界,下界限超出屏幕邊界,左界限超出屏幕邊界以及右界限超出屏幕邊界,此時(shí)需要根據(jù)鼠標(biāo)所在位置,對(duì)被抓取區(qū)域重新計(jì)算。計(jì)算方法將在附錄中體現(xiàn)。以下為代碼實(shí)現(xiàn):LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)/回調(diào)函數(shù),消息響應(yīng)機(jī)制PAINTSTRUCT ps;HDC hdc;switch (message)case WM_TIMER:GetCursorPos(&m_ptCur);/

50、獲取鼠標(biāo)位置HDC hDC = GetDC(hWnd);/取得程序句柄為之后的復(fù)制做準(zhǔn)備HDC hDeskTopDC = GetDC(NULL);/取得窗口句柄RECT hDlgRgn,hImgRgn;/*hDlgRgn.left = m_ptCur.x - m_iWndCX/2;hDlgRgn.top = m_ptCur.y - m_iWndCY/2;hDlgRgn.right = m_ptCur.x + m_iWndCX/2;hDlgRgn.bottom = m_ptCur.y + m_iWndCY/2;*/hImgRgn.left = (INT)(m_ptCur.x - (FLOAT)m

51、_iWndCX/2/m_fMultyValue);hImgRgn.top = (INT)(m_ptCur.y - (FLOAT)m_iWndCY/2/m_fMultyValue);hImgRgn.right = (INT)(m_ptCur.x + (FLOAT)m_iWndCX/2/m_fMultyValue);hImgRgn.bottom = (INT)(m_ptCur.y + (FLOAT)m_iWndCY/2/m_fMultyValue);/被抓取區(qū)域與放大窗口重合if( (m_cWndType = WND_LEFT) &(hImgRgn.left=m_iWndCX) & (hImgRg

52、n.top=(GetSystemMetrics(SM_CXSCREEN)-m_iWndCX) & (hImgRgn.top=m_iWndCY) )m_cWndType = WND_LEFT;SetWndPos();/被抓取區(qū)域左界限到達(dá)邊界if(hImgRgn.left0)hImgRgn.left=0;hImgRgn.right = (INT)(m_ptCur.x *2);hImgRgn.top=(INT)(m_ptCur.y (m_ptCur.x)*(m_iWndCY/2/m_fMultyValue)/(m_iWndCX/2/m_fMultyValue);hImgRgn.bottom=(IN

53、T)(m_ptCur.y +(m_ptCur.x)*(m_iWndCY/2/m_fMultyValue)/(m_iWndCX/2/m_fMultyValue);/被抓取區(qū)域上界限到達(dá)邊界if(hImgRgn.topGetSystemMetrics(SM_CYSCREEN)hImgRgn.bottom = GetSystemMetrics(SM_CYSCREEN);hImgRgn.top=(INT)(m_ptCur.y)*2-GetSystemMetrics(SM_CYSCREEN);hImgRgn.left = (INT)(m_ptCur.x -( GetSystemMetrics(SM_CYSCREEN) -(m_ptCur.y) )*( m_iWndCX/2/m_fMultyValue ) /( m_iWndCY/2/m_fMultyValue );hImgRgn.right = (INT)(m_ptCur.x +( GetSystemMetrics(SM_CYSCREEN)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論