




已閱讀5頁(yè),還剩22頁(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)介
目錄上機(jī)實(shí)驗(yàn)說(shuō)明1【實(shí)驗(yàn)環(huán)境】1【實(shí)驗(yàn)要求】1【實(shí)驗(yàn)項(xiàng)目及學(xué)時(shí)分配】1【實(shí)驗(yàn)報(bào)告和考核】1【實(shí)驗(yàn)大綱】見(jiàn)附錄A2【Visual C+語(yǔ)言圖形系統(tǒng)介紹】見(jiàn)附錄B2實(shí)驗(yàn)(一)3【實(shí)驗(yàn)題目】 基本圖元繪制3【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】3【實(shí)驗(yàn)報(bào)告要求】4實(shí)驗(yàn)(二)5【實(shí)驗(yàn)題目】 二維圖元的幾何變換5【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】5【實(shí)驗(yàn)報(bào)告要求】6實(shí)驗(yàn)(三)7【實(shí)驗(yàn)題目】 線段、多邊形裁剪算法實(shí)現(xiàn)7【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】7實(shí)驗(yàn)(四)8【實(shí)驗(yàn)題目】 三維觀察算法實(shí)現(xiàn)8【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】8實(shí)驗(yàn)(五)9【實(shí)驗(yàn)題目】 光照模型與紋理映射實(shí)現(xiàn)9【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】9【實(shí)驗(yàn)報(bào)告要求】9附錄A10計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)教學(xué)大綱10附錄B12Visual C+語(yǔ)言圖形系統(tǒng)介紹12上機(jī)實(shí)驗(yàn)說(shuō)明【實(shí)驗(yàn)環(huán)境】操作系統(tǒng):Microsoft Windows 2000或以上系統(tǒng)。軟件平臺(tái):Visual C+6.0程序開(kāi)發(fā)的軟件平臺(tái)及OpenGL圖形庫(kù)?!緦?shí)驗(yàn)要求】1、每次實(shí)驗(yàn)前,熟悉實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容及相關(guān)的基本理論知識(shí)。2、無(wú)特殊要求,原則上實(shí)驗(yàn)為1人1組,必須獨(dú)立完成。3、實(shí)驗(yàn)所用機(jī)器最好固定,以便更好地實(shí)現(xiàn)實(shí)驗(yàn)之間的延續(xù)性和相關(guān)性,并便于檢查。4、按要求認(rèn)真做好實(shí)驗(yàn)過(guò)程及結(jié)果記錄。【實(shí)驗(yàn)項(xiàng)目及學(xué)時(shí)分配】本實(shí)驗(yàn)共計(jì)10學(xué)時(shí),實(shí)驗(yàn)項(xiàng)目及學(xué)時(shí)分配如下:序號(hào)實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)類(lèi)型學(xué)時(shí)要求1基本圖元繪制設(shè)計(jì)2必做2二維圖元的幾何變換驗(yàn)證2必做3線段、多邊形裁剪算法實(shí)現(xiàn)驗(yàn)證2必做4三維觀察算法實(shí)現(xiàn)設(shè)計(jì)2必做5光照模型與紋理映射實(shí)現(xiàn)驗(yàn)證2必做【實(shí)驗(yàn)報(bào)告和考核】1、實(shí)驗(yàn)報(bào)告必需采用統(tǒng)一的實(shí)驗(yàn)報(bào)告紙,撰寫(xiě)符合一定的規(guī)范,詳見(jiàn)實(shí)驗(yàn)報(bào)告撰寫(xiě)格式及規(guī)范。2、本實(shí)驗(yàn)占該課程最終評(píng)定成績(jī)的15。【實(shí)驗(yàn)大綱】見(jiàn)附錄A【Visual C+語(yǔ)言圖形系統(tǒng)介紹】見(jiàn)附錄B實(shí)驗(yàn)(一)【實(shí)驗(yàn)題目】 基本圖元繪制【實(shí)驗(yàn)?zāi)康摹?、通過(guò)本實(shí)驗(yàn),掌握在VC6.0環(huán)境下基于OpenGL程序開(kāi)發(fā)的運(yùn)行環(huán)境配置,了解基于OpenGL圖形庫(kù)的控制臺(tái)圖形程序開(kāi)發(fā)框架,并對(duì)二維觀察變換中相關(guān)函數(shù)的使用及參數(shù)有所了解。2、掌握OpenGL基本圖元的繪制方法和屬性控制方法,并編程實(shí)現(xiàn)綜合使用多種圖形函數(shù)繪制復(fù)雜圖形?!緦?shí)驗(yàn)內(nèi)容】1. VC6.0環(huán)境下基于OpenGL程序開(kāi)發(fā)的運(yùn)行環(huán)境配置由于VC6.0應(yīng)用程序開(kāi)發(fā)系統(tǒng)只支持OpenGL核心庫(kù)函數(shù),而在程序開(kāi)發(fā)中需使用大量核心庫(kù)所不具有的函數(shù),因此,在進(jìn)行圖形開(kāi)發(fā)前需進(jìn)行OpenGL程序開(kāi)發(fā)的運(yùn)行環(huán)境配置。在此需將有關(guān)的函數(shù)庫(kù)文件拷貝到指定的文件目錄下即可。過(guò)程如下:將OpenGL開(kāi)發(fā)庫(kù)子目錄下INCLUDE所有文件拷貝到VC所在子目錄的includegl目錄下。將OpenGL開(kāi)發(fā)庫(kù)子目錄下LIB所有文件拷貝到VC所在子目錄的lib目錄下。將OpenGL開(kāi)發(fā)庫(kù)子目錄下DLL所有文件拷貝到windows所在子目錄的system32目錄下。2OpenGL控制臺(tái)應(yīng)用程序框架OpenGL控制臺(tái)應(yīng)用程序框架及各函數(shù)的作用、參數(shù)情況說(shuō)明見(jiàn)教材2.2.1節(jié) OpenGL控制臺(tái)應(yīng)用程序框架。3基本圖元繪制該實(shí)驗(yàn)將綜合利用第二章、第三章中有關(guān)基本圖元及其屬性控制的函數(shù),自我設(shè)計(jì)能夠?qū)⑾聦賵D形要素涵蓋的圖形,并編程實(shí)現(xiàn)?;緢D元:應(yīng)包括點(diǎn)、線段、各種多邊形;屬性控制:應(yīng)包括顏色設(shè)置、不同大小的點(diǎn)(如1像素點(diǎn)、3像素點(diǎn)等)、不同類(lèi)型的線段(實(shí)線、點(diǎn)劃線等);繪制出屏幕坐標(biāo)系的2個(gè)坐標(biāo)軸,并利用多邊形繪制函數(shù)繪制1個(gè)圓?!緦?shí)驗(yàn)報(bào)告要求】1簡(jiǎn)述VC+環(huán)境下OpenGL圖形系統(tǒng)開(kāi)發(fā)的一般過(guò)程。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中遇到的主要問(wèn)題及解決過(guò)程。3圖形坐標(biāo)與世界坐標(biāo)系、屏幕視口坐標(biāo)系之間的關(guān)系是什么?在放大、縮小觀察圖形時(shí)應(yīng)調(diào)節(jié)那些函數(shù)的那些參數(shù)?實(shí)驗(yàn)(二)【實(shí)驗(yàn)題目】 二維圖元的幾何變換【實(shí)驗(yàn)?zāi)康摹?、了解和掌握二維坐標(biāo)系中物體坐標(biāo)、觀察坐標(biāo)、屏幕坐標(biāo)之間的關(guān)系,能夠在合適的位置定義物體的幾何形狀,并通過(guò)定義合適的觀察坐標(biāo)系在視口中顯示出物體。2、了解和掌握以坐標(biāo)原點(diǎn)、坐標(biāo)軸為中心的物體幾何變換方式,包括平移、旋轉(zhuǎn)和縮放對(duì)應(yīng)的函數(shù)。3、了解和掌握矩陣操作函數(shù)的原理和過(guò)程,并實(shí)現(xiàn)繞任意點(diǎn)或任意軸為中心進(jìn)行平移、旋轉(zhuǎn)、縮放程序。【實(shí)驗(yàn)內(nèi)容】1 了解和掌握二維坐標(biāo)系中物體坐標(biāo)、觀察坐標(biāo)、屏幕坐標(biāo)之間的關(guān)系。要求:對(duì)上一次編寫(xiě)的程序中的幾何物體改變其幾何位置和大小,改變gluOrtho2D函數(shù)中的參數(shù),改變glViewport中的參數(shù),觀察所要繪制的圖形和視口的位置發(fā)生了什么變化,并思考原因。2 了解和掌握以坐標(biāo)原點(diǎn)、坐標(biāo)軸為中心的物體幾何變換方式。要求:繪制一個(gè)二維圖形,并使用以坐標(biāo)原點(diǎn)、坐標(biāo)軸為中心的物體幾何變換(包括平移、旋轉(zhuǎn)和縮放)函數(shù),對(duì)其進(jìn)行相應(yīng)的幾何變換,并以不同顏色加以區(qū)分。3了解和掌握矩陣操作函數(shù)的原理和過(guò)程。要求:采用矩陣操作方式實(shí)現(xiàn)與第二步中相同的幾何變換過(guò)程。4實(shí)現(xiàn)繞任意點(diǎn)或任意軸為中心進(jìn)行平移、旋轉(zhuǎn)、縮放程序。要求:根據(jù)課堂上所講的繞任意點(diǎn)或任意軸為中心進(jìn)行幾何變換的原理,編寫(xiě)相應(yīng)的平移、旋轉(zhuǎn)和縮放函數(shù),并采用所實(shí)現(xiàn)的函數(shù)對(duì)所繪制的圖形實(shí)現(xiàn)繞任意點(diǎn)或任意軸為中心的幾何變換?!緦?shí)驗(yàn)報(bào)告要求】1總結(jié)并簡(jiǎn)述繞任意點(diǎn)或任意軸為中心進(jìn)行幾何變換的原理。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中遇到的主要問(wèn)題及解決過(guò)程。3用矩陣操作實(shí)現(xiàn)幾何變換有何優(yōu)點(diǎn)?實(shí)驗(yàn)(三)【實(shí)驗(yàn)題目】 線段、多邊形裁剪算法實(shí)現(xiàn)【實(shí)驗(yàn)?zāi)康摹?、深入了解和掌握Cohen_Sutherland線段裁剪算法的原理和程序?qū)崿F(xiàn)過(guò)程。2、深入了解和掌握Sutherland-Hodgman多邊形裁剪算法的原理和程序?qū)崿F(xiàn)過(guò)程?!緦?shí)驗(yàn)內(nèi)容】1. 根據(jù)Cohen-Sutherland直線裁剪算法的原理,實(shí)現(xiàn)用矩形對(duì)某線段的裁剪過(guò)程。要求:根據(jù)Cohen-Sutherland直線裁剪算法的原理,編寫(xiě)實(shí)現(xiàn)該算法的各個(gè)子函數(shù),并在屏幕上畫(huà)出用于裁剪的矩形窗口,用不同的顏色和線型標(biāo)注被裁剪的線段及裁剪后的結(jié)果。2. 根據(jù)Sutherland-Hodgman多邊形裁剪算法的原理,實(shí)現(xiàn)用矩形對(duì)某線段的裁剪過(guò)程。要求:根據(jù)Sutherland-Hodgman多邊形裁剪算法的原理,編寫(xiě)實(shí)現(xiàn)該算法的各個(gè)子函數(shù),并在屏幕上畫(huà)出用于裁剪的矩形窗口,用不同的顏色和線型標(biāo)注被裁剪的多邊形及裁剪后的結(jié)果。【實(shí)驗(yàn)報(bào)告要求】1總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中遇到的主要問(wèn)題及解決過(guò)程。2在Cohen-Sutherland直線裁剪算法中若改變9個(gè)區(qū)域的編碼方式會(huì)對(duì)裁剪結(jié)果產(chǎn)生什么影響?3在OpenGL中如何實(shí)現(xiàn)對(duì)二維圖形的裁剪?實(shí)驗(yàn)(四)【實(shí)驗(yàn)題目】 三維觀察算法實(shí)現(xiàn)【實(shí)驗(yàn)?zāi)康摹?. 了解和掌握三維空間中幾何物體的繪制方法。2. 了解和掌握三維觀察變換的原理及OpenGL中實(shí)現(xiàn)三維觀察變換函數(shù)的參數(shù)對(duì)三維觀察的影響?!緦?shí)驗(yàn)內(nèi)容】1、了解和掌握三維空間中幾何物體的繪制方法。要求:了解在三維空間坐標(biāo)系中三維物體的定義方法,注意多邊形內(nèi)部和外部定義,并繪制一個(gè)包含內(nèi)、外部的三維物體。2、實(shí)現(xiàn)三維觀察變換。要求:利用gluPerspective等相關(guān)三維觀察變換函數(shù),實(shí)現(xiàn)對(duì)上面所繪制的三維物體進(jìn)行三維裁剪和三維變換,并對(duì)函數(shù)中的參數(shù)進(jìn)行改變,并觀察屏幕顯示結(jié)果,進(jìn)一步了解三維觀察變換的原理。【實(shí)驗(yàn)報(bào)告要求】1總結(jié)三維觀察變換相關(guān)函數(shù)中參數(shù)的不同變化對(duì)三維觀察結(jié)果的影響。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中遇到的主要問(wèn)題及解決過(guò)程。3glMatrixMode函數(shù)對(duì)三維觀察變換有何影響?實(shí)驗(yàn)(五)【實(shí)驗(yàn)題目】 光照模型與紋理映射實(shí)現(xiàn)【實(shí)驗(yàn)?zāi)康摹? 熟悉三維空間中光照模型的原理,掌握OpenGL中光照模型的定義方法。2 了解三維物體紋理映射的基本原理,掌握OpenGL中紋理映射的基本方法?!緦?shí)驗(yàn)內(nèi)容】1、 OpenGL中光照模型的定義方法的實(shí)現(xiàn)。要求:繪制一個(gè)空間三維物體,并在三維空間中定義不同的光源,涉及不同的光源類(lèi)型、光的顏色,并開(kāi)啟光源,觀察通過(guò)改變定義光源的不同參數(shù),說(shuō)得到的繪制結(jié)果有何不同。2、 OpenGL中紋理映射的實(shí)現(xiàn)。要求:畫(huà)出一個(gè)二維圖形,并采用程序生成紋理或讀入紋理圖像的方法,對(duì)所繪制的二維圖形進(jìn)行紋理映射,通過(guò)改變不同的參數(shù)觀察所得到的結(jié)果有何不同?!緦?shí)驗(yàn)報(bào)告要求】1總結(jié)三維空間中定義光照模型的過(guò)程,及定義光照模型相關(guān)函數(shù)中參數(shù)的不同變化對(duì)觀察結(jié)果的影響。2總結(jié)三維空間中紋理映射的過(guò)程,及紋理映射相關(guān)函數(shù)中參數(shù)的不同變化對(duì)觀察結(jié)果的影響。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中遇到的主要問(wèn)題及解決過(guò)程。附錄A計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)教學(xué)大綱一、制定實(shí)驗(yàn)教學(xué)大綱的依據(jù)根據(jù)本校2006級(jí)本科指導(dǎo)性培養(yǎng)計(jì)劃和2005年6月制定的計(jì)算機(jī)圖形學(xué)課程教學(xué)大綱制定。二、本實(shí)驗(yàn)課在專(zhuān)業(yè)人才培養(yǎng)中的地位和作用計(jì)算機(jī)圖形學(xué)是電子信息工程專(zhuān)業(yè)(圖文處理方向)必修的一門(mén)專(zhuān)業(yè)基礎(chǔ)課。通過(guò)本課程的學(xué)習(xí),可以使學(xué)生了解計(jì)算機(jī)圖形學(xué)所研究的內(nèi)容、廣泛的應(yīng)用,掌握計(jì)算機(jī)圖形的基本生成算法、圖形幾何變換的原理及實(shí)現(xiàn)方法、二維和三維觀察、圖形表示、曲線、曲面的圖形生成技術(shù)及真實(shí)感圖形等。同時(shí)結(jié)合OpenGL圖形庫(kù)的使用,使學(xué)生掌握?qǐng)D形程序開(kāi)發(fā)的基本技術(shù)和方法。三、本實(shí)驗(yàn)課程講授的基本實(shí)驗(yàn)理論主要講授利用OpenGL圖形庫(kù)函數(shù)進(jìn)行二維、三維圖形的繪制的基本方法,從而使學(xué)生能將計(jì)算機(jī)圖形學(xué)的基本理論與OpenGL圖形開(kāi)發(fā)實(shí)踐有機(jī)結(jié)合起來(lái),加深對(duì)理論的理解和應(yīng)用實(shí)踐能力。主要涉及圖形光柵化原理,及基于光柵化原理的所進(jìn)行的基本圖元的生成、填充、裁剪算法、二維圖形變換、二維和三維觀察變換、光照模型和紋理映射等。1OpenGL運(yùn)行環(huán)境配置及基本圖元繪制;2二維觀察變換及二維圖形幾何變換;3線段裁剪、多邊形裁剪算法;4三維觀察變換;5真實(shí)感圖形繪制中光照模型的設(shè)置和紋理映射過(guò)程。四、本實(shí)驗(yàn)課學(xué)生應(yīng)達(dá)到的能力本實(shí)驗(yàn)開(kāi)設(shè)的目的:一方面使學(xué)生通過(guò)實(shí)驗(yàn)對(duì)圖形學(xué)基本理論和算法在實(shí)踐中的應(yīng)用有一個(gè)直觀、深刻的認(rèn)識(shí),從而使學(xué)生掌握將理論應(yīng)用于實(shí)踐的方法,同時(shí)對(duì)理論的認(rèn)識(shí)得到深化;另一方面,通過(guò)編程訓(xùn)練加強(qiáng)了學(xué)生對(duì)基于OpenGL圖形庫(kù)的基本圖形算法、二維圖形變換、二三維觀察變換、真實(shí)感圖形處理等實(shí)際編程動(dòng)手能力的訓(xùn)練;為學(xué)生進(jìn)一步了解和掌握包括圖形用戶界面、CAD、數(shù)字圖像處理等的原理、技術(shù)、方法打下堅(jiān)實(shí)的理論和實(shí)踐基礎(chǔ)。五、學(xué)時(shí)、教學(xué)文件及形式學(xué)時(shí):本課程總學(xué)時(shí)為48學(xué)時(shí),其中實(shí)驗(yàn)為10學(xué)時(shí),占總學(xué)時(shí)的20%。教學(xué)文件:校編計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書(shū);實(shí)驗(yàn)報(bào)告學(xué)生自擬。要求學(xué)生實(shí)驗(yàn)前預(yù)習(xí)實(shí)驗(yàn)指導(dǎo)書(shū),并理解相關(guān)算法思想及軟件實(shí)現(xiàn)過(guò)程,具體編程過(guò)程由學(xué)生獨(dú)立完成。六、實(shí)驗(yàn)考核辦法與成績(jī)?cè)u(píng)定實(shí)驗(yàn)課成績(jī)占本課程總成績(jī)15%,對(duì)缺少實(shí)驗(yàn)成績(jī)者,本課程不予通過(guò)(對(duì)實(shí)驗(yàn)成績(jī)的考核包括上機(jī)編程結(jié)果占50%,實(shí)驗(yàn)報(bào)告占40%,考勤占10%)。七、儀器設(shè)備及注意事項(xiàng)儀器設(shè)備:有快速的較高性能微機(jī)和較大內(nèi)存與硬盤(pán)的設(shè)備注意事項(xiàng):注意保護(hù)設(shè)備八、實(shí)驗(yàn)項(xiàng)目的設(shè)置及學(xué)時(shí)分配序號(hào)實(shí) 驗(yàn) 項(xiàng) 目學(xué)時(shí)實(shí)驗(yàn)類(lèi)型要求適用專(zhuān)業(yè)備注1基本圖元繪制2設(shè)計(jì)必修電子信息工程專(zhuān)業(yè)(圖文處理方向)上機(jī)2二維圖元的幾何變換2驗(yàn)證必修電子信息工程專(zhuān)業(yè)(圖文處理方向)上機(jī)3線段、多邊形裁剪算法實(shí)現(xiàn)2驗(yàn)證必修電子信息工程專(zhuān)業(yè)(圖文處理方向)上機(jī)4三維觀察算法實(shí)現(xiàn)2設(shè)計(jì)必修電子信息工程專(zhuān)業(yè)(圖文處理方向)上機(jī)5光照模型與紋理映射實(shí)現(xiàn)2驗(yàn)證必修電子信息工程專(zhuān)業(yè)(圖文處理方向)上機(jī)制 定 人:吳學(xué)毅審 核 人:張二虎批 準(zhǔn) 人:周世生制定日期:2005.7附錄BVisual C+語(yǔ)言圖形系統(tǒng)介紹一VC環(huán)境設(shè)置及調(diào)試1VC環(huán)境設(shè)置VC的處理流程大致分為兩步:編譯和連接。源文件通過(guò)編譯生成了.obj文件;所有.obj文件和.lib文件通過(guò)連接生成.exe文件或.dll文件。VC的處理流程如下: 圖1 VC的處理流程1.1 編譯參數(shù)的設(shè)置。主要通過(guò)VC的菜單項(xiàng)Project-Settings-C/C+頁(yè)來(lái)完成??梢钥吹竭@一頁(yè)的最下面Project Options中的內(nèi)容,一般如下:1) General:一些總體設(shè)置。Warning level用來(lái)控制警告信息,其中None表示不顯示警告信息,Level 1只顯示很?chē)?yán)重的警告信息,其他級(jí)別依次增加一些次嚴(yán)重的警告信息;Warnings as errors將警告信息當(dāng)作錯(cuò)誤處理;Optimizations是代碼優(yōu)化,可以在Category的Optimizations項(xiàng)中進(jìn)行更細(xì)的設(shè)置。2) C+ Language:pointer_to_member representation用來(lái)設(shè)置類(lèi)定義/引用的先后關(guān)系,一般為Best-Case Always表示在引用類(lèi)之前該類(lèi)肯定已經(jīng)定義了;Enable Exception Handling,進(jìn)行同步的異常處理;Enable Run-Time Type Information迫使編譯器增加代碼在運(yùn)行時(shí)進(jìn)行對(duì)象類(lèi)型檢查;Disable Construction Displacements,設(shè)置類(lèi)構(gòu)造/析構(gòu)函數(shù)調(diào)用虛函數(shù)問(wèn)題。3) Code Generation:Processor表示代碼指令優(yōu)化,可以為80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各種優(yōu)化。Use run-time library用以指定程序運(yùn)行時(shí)使用的運(yùn)行時(shí)庫(kù)(單線程或多線程,Debug版本或Release版本),有一個(gè)原則就是,一個(gè)進(jìn)程不要同時(shí)使用幾個(gè)版本的運(yùn)行時(shí)庫(kù)。4) Customize:Disable Language Extensions,表示不使用微軟為標(biāo)準(zhǔn)C做的語(yǔ)言擴(kuò)展;Eliminate Duplicate Strings,主要用于字符串優(yōu)化(將字符串放到緩充池里以節(jié)省空間)。5) Listing Files:Generate browse info的功能上面已經(jīng)提到過(guò)。這里可以進(jìn)行更多的設(shè)置。Exclude Local Variables from Browse Info表示是否將局部變量的信息放到.SBR文件中。6) Optimizations:代碼優(yōu)化設(shè)置??梢赃x擇Maximize Speed生成最快速的代碼,或Minimize Size生成最小尺寸的程序,或者Customize定制優(yōu)化。7) Precompiled Headers:預(yù)編譯頭文件的設(shè)置。使用預(yù)編譯可以提高重復(fù)編譯的速度。VC一般將一些公共的、不大變動(dòng)的頭文件(比如afxwin.h等)集中放到stdafx.h中,這一部分代碼就不必每次都重新編譯(除非是Rebuild All)。8) Preprocessor:預(yù)編譯處理??梢远x/解除定義一些常量。Additional include directories,可以指定額外的包含目錄,一般是相對(duì)于本項(xiàng)目的目錄,如.Include。1.2 連接參數(shù)的設(shè)置。主要通過(guò)VC的菜單項(xiàng)Project-Settings-Link頁(yè)來(lái)完成。1) General:一些總體設(shè)置??梢栽O(shè)置生成的文件路徑、文件名;連接的庫(kù)文件;Generate debug info,生成Debug信息到.PDB文件(具體格式可以在Category-Debug中設(shè)置);Ignore All Default Libraries,放棄所有默認(rèn)的庫(kù)連接;Link Incrementally,通過(guò)生成. ILK文件實(shí)現(xiàn)遞增式連接以提高后續(xù)連接速度,但一般這種方式下生成的文件(EXE或DLL)較大;Generate Mapfile,生成.MAP文件記錄模塊相關(guān)信息;Enable Profiling,這個(gè)參數(shù)通常與Generate Mapfile參數(shù)同時(shí)使用,而且如果產(chǎn)生Debug信息的話,不能用.PDB文件,而且必須用Microsoft Format。2) Customize:這里可以進(jìn)行使用程序數(shù)據(jù)庫(kù)文件的設(shè)置。Force File Output ,強(qiáng)制產(chǎn)生輸出文件(EXE或DLL);Print Progress Messages,可以將連接過(guò)程中的進(jìn)度信息輸出到Output窗口。3) Debug:設(shè)置是否生成調(diào)試信息,以及調(diào)試信息的格式。格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三種選擇;Separate Types,表示將Debug格式信息以獨(dú)立的.PDB文件存放,還是直接放在各個(gè)源文件的.PDB文件中。選中的話,表示采用后者的方式,這種方式調(diào)試啟動(dòng)比較快。4) Input:這里可以指定要連接的庫(kù)文件,放棄連接的庫(kù)文件。還可以增加額外的庫(kù)文件目錄,一般是相對(duì)于本項(xiàng)目的目錄,如.Lib。Force Symbol References,可以指定連接特定符號(hào)定義的庫(kù)。5) Output:Base Address可以改變程序默認(rèn)的基地址(EXE文件默認(rèn)為0x400000,DLL默認(rèn)為0x10000000),操作系統(tǒng)裝載一個(gè)程序時(shí)總是試著先從這個(gè)基地址開(kāi)始。Entry-Point Symbol可以指定程序的入口地址,一般為一個(gè)函數(shù)名(且必須采用_stdcall調(diào)用約定)。一般Win32的程序,EXE的入口為WinMain,DLL的入口為DllEntryPoint;最好讓連接器自動(dòng)設(shè)置程序的入口點(diǎn)。2調(diào)試2.1為了調(diào)試一個(gè)程序,首先必須使程序中包含調(diào)試信息。一般情況下,一個(gè)從AppWizard創(chuàng)建的工程中包含的DebugConfiguration自動(dòng)包含調(diào)試信息,但是不是Debug版本并不是程序包含調(diào)試信息的決定因素,程序設(shè)計(jì)者可以在任意的Configuration中增加調(diào)試信息,包括Release版本。為了增加調(diào)試信息,可以按照下述步驟進(jìn)行: 打開(kāi)Projectsettings對(duì)話框(可以通過(guò)快捷鍵ALT+F7打開(kāi),也可以通過(guò)IDE菜單Project/Settings打開(kāi)) 選擇C/C+頁(yè),Category中選擇general,則出現(xiàn)一個(gè)DebugInfo下拉列表框,可供選擇的調(diào)試信息方式包括:命令行Projectsettings說(shuō)明無(wú)None沒(méi)有調(diào)試信息/ZdLineNumbersOnly目標(biāo)文件或者可執(zhí)行文件中只包含全局和導(dǎo)出符號(hào)以及代碼行信息,不包含符號(hào)調(diào)試信息/Z7C7.0-Compatible目標(biāo)文件或者可執(zhí)行文件中包含行號(hào)和所有符號(hào)調(diào)試信息,包括變量名及類(lèi)型,函數(shù)及原型等/ZiProgramDatabase創(chuàng)建一個(gè)程序庫(kù)(PDB),包括類(lèi)型信息和符號(hào)調(diào)試信息。/ZIProgramDatabaseforEditandContinue除了前面/Zi的功能外,這個(gè)選項(xiàng)允許對(duì)代碼進(jìn)行調(diào)試過(guò)程中的修改和繼續(xù)執(zhí)行。這個(gè)選項(xiàng)同時(shí)使#pragma設(shè)置的優(yōu)化功能無(wú)效 選擇Link頁(yè),選中復(fù)選框GenerateDebugInfo,這個(gè)選項(xiàng)將使連接器把調(diào)試信息寫(xiě)進(jìn)可執(zhí)行文件和DLL 如果C/C+頁(yè)中設(shè)置了ProgramDatabase以上的選項(xiàng),則Linkincrementally可以選擇。選中這個(gè)選項(xiàng),將使程序可以在上一次編譯的基礎(chǔ)上被編譯(即增量編譯),而不必每次都從頭開(kāi)始編譯。 2.2斷點(diǎn)斷點(diǎn)是調(diào)試器設(shè)置的一個(gè)代碼位置。當(dāng)程序運(yùn)行到斷點(diǎn)時(shí),程序中斷執(zhí)行,回到調(diào)試器。斷點(diǎn)是最常用的技巧。調(diào)試時(shí),只有設(shè)置了斷點(diǎn)并使程序回到調(diào)試器,才能對(duì)程序進(jìn)行在線調(diào)試。設(shè)置斷點(diǎn):可以通過(guò)下述方法設(shè)置一個(gè)斷點(diǎn)。首先把光標(biāo)移動(dòng)到需要設(shè)置斷點(diǎn)的代碼行上,然后 按F9快捷鍵 彈出Breakpoints對(duì)話框,方法是按快捷鍵CTRL+B或ALT+F9,或者通過(guò)菜單Edit/Breakpoints打開(kāi)。打開(kāi)后點(diǎn)擊Breakat編輯框的右側(cè)的箭頭,選擇合適的位置信息。一般情況下,直接選擇linexxx就足夠了,如果想設(shè)置不是當(dāng)前位置的斷點(diǎn),可以選擇Advanced,然后填寫(xiě)函數(shù)、行號(hào)和可執(zhí)行文件信息。 去掉斷點(diǎn):把光標(biāo)移動(dòng)到給定斷點(diǎn)所在的行,再次按F9就可以取消斷點(diǎn)。同前面所述,打開(kāi)Breakpoints對(duì)話框后,也可以按照界面提示去掉斷點(diǎn)。條件斷點(diǎn):可以為斷點(diǎn)設(shè)置一個(gè)條件,這樣的斷點(diǎn)稱(chēng)為條件斷點(diǎn)。對(duì)于新加的斷點(diǎn),可以單擊Conditions按鈕,為斷點(diǎn)設(shè)置一個(gè)表達(dá)式。當(dāng)這個(gè)表達(dá)式發(fā)生改變時(shí),程序就被中斷。底下設(shè)置包括“觀察數(shù)組或者結(jié)構(gòu)的元素個(gè)數(shù)”,似乎可以設(shè)置一個(gè)指針?biāo)赶虻膬?nèi)存區(qū)的大小。最后一個(gè)設(shè)置可以讓程序先執(zhí)行多少次然后才到達(dá)斷點(diǎn)。數(shù)據(jù)斷點(diǎn):數(shù)據(jù)斷點(diǎn)只能在Breakpoints對(duì)話框中設(shè)置。選擇“Data”頁(yè),就顯示了設(shè)置數(shù)據(jù)斷點(diǎn)的對(duì)話框。在編輯框中輸入一個(gè)表達(dá)式,當(dāng)這個(gè)表達(dá)式的值發(fā)生變化時(shí),數(shù)據(jù)斷點(diǎn)就到達(dá)。一般情況下,這個(gè)表達(dá)式應(yīng)該由運(yùn)算符和全局變量構(gòu)成,例如:在編輯框中輸入g_bFlag這個(gè)全局變量的名字,那么當(dāng)程序中有g(shù)_bFlag=!g_bFlag時(shí),程序就將停在這個(gè)語(yǔ)句處。消息斷點(diǎn):VC也支持對(duì)Windows消息進(jìn)行截獲。有兩種方式進(jìn)行截獲:窗口消息處理函數(shù)和特定消息中斷。在Breakpoints對(duì)話框中選擇Messages頁(yè),就可以設(shè)置消息斷點(diǎn)。如果在上面那個(gè)對(duì)話框中寫(xiě)入消息處理函數(shù)的名字,那么每次消息被這個(gè)函數(shù)處理,斷點(diǎn)就到達(dá)。如果在底下的下拉列表框選擇一個(gè)消息,則每次這種消息到達(dá),程序就中斷。二、Visual C+語(yǔ)言圖形系統(tǒng)介紹1圖形設(shè)備接口(GDI)的基本概念圖形設(shè)備接口(GDI)是一個(gè)可執(zhí)行程序,它接受Windows應(yīng)用程序的繪圖請(qǐng)求(表現(xiàn)為GDI函數(shù)調(diào)用),并將它們傳給相應(yīng)的設(shè)備驅(qū)動(dòng)程序,完成特定于硬件的輸出,向打印機(jī)輸出和屏幕輸出。2三種圖形輸出類(lèi)型 應(yīng)用程序可以使用GDI創(chuàng)建三種類(lèi)型的圖形輸出:矢量輸出、光柵圖形輸出和文本輸出。矢量圖形輸出:矢量圖形輸出指的是創(chuàng)建線條和填充圖形,包括點(diǎn)、直線、曲線、多邊形、扇形和矩形的繪制。光柵輸出:光柵圖形的輸出是指光柵圖形函數(shù)對(duì)以位圖形式存儲(chǔ)的數(shù)據(jù)進(jìn)行操作,它包括各種位圖和圖標(biāo)的輸出。在屏幕上表現(xiàn)為對(duì)若干行和列的像素的操作,在打印機(jī)上則是若干行和列的點(diǎn)陣的輸出。 文本輸出:與DOS字符方式下的輸出不同,Windows是按圖形方式輸出的。這樣,在輸出文本時(shí),必須以邏輯坐標(biāo)為單位計(jì)算文本的輸出位置,而不是象DOS下以文本行為單位輸出文本。這比DOS下的文本輸出要難一些。但是,按圖形方式輸出文本也給文本輸出帶來(lái)很大的靈活性。用戶可以通過(guò)調(diào)用各種GDI函數(shù),制造出各種文本輸出效果,包括加粗、斜體、設(shè)置顏色等。Windows還提供了一種TrueType(寫(xiě)真字體)。TrueType字體用一組直線和曲線命令及一些參數(shù)來(lái)描述字體的輪廓。Windows可以通過(guò)參數(shù)來(lái)調(diào)整直線的長(zhǎng)度和曲線的形狀,從而實(shí)現(xiàn)對(duì)字體的自由縮放。3. MFC中與GDI有關(guān)的類(lèi) MFC提供了兩種重要的類(lèi):設(shè)備上下文類(lèi),用于設(shè)置繪圖屬性和繪制圖形;繪圖對(duì)象類(lèi),封裝了各種GDI繪圖對(duì)象,包括畫(huà)筆、刷子、字體、位圖、調(diào)色板和區(qū)域。3.1設(shè)備上下文類(lèi)設(shè)備上下文類(lèi)包括CDC和它的派生類(lèi)CClientDC、CPaintDC、CWindowDC、CMetaFileDC。CDC是設(shè)備上下文類(lèi)的基類(lèi),除了一般的窗口顯示外,還用于基于桌面的全屏幕繪制和非屏幕顯示的打印機(jī)輸出。CDC類(lèi)封裝了所有圖形輸出函數(shù),包括矢量、光柵和文本輸出。CClientDC(客戶區(qū)設(shè)備上下文)用于客戶區(qū)的輸出,它在構(gòu)造函數(shù)中封裝了GetDC(),在析構(gòu)函數(shù)中封裝了ReleaseDC()函數(shù)。一般在響應(yīng)非窗口重畫(huà)消息(如鍵盤(pán)輸入時(shí)繪制文本、鼠標(biāo)繪圖)繪圖時(shí)要用到它。用法是:CClientDC dc(this);/this一般指向本窗口或當(dāng)前活動(dòng)視圖dc.TextOut(10,10,str,str.GetLength();/利用dc輸出文本,如果是在CScrollView中使用,還要注意調(diào) /用OnPrepareDC(&dc)調(diào)整設(shè)備上下文的坐標(biāo)。CPaintDC用于響應(yīng)窗口重繪消息(WM_PAINT)是的繪圖輸出。CPaintDC在構(gòu)造函數(shù)中調(diào)用BeginPaint()取得設(shè)備上下文,在析構(gòu)函數(shù)中調(diào)用EndPaint()釋放設(shè)備上下文。EndPaint()除了釋放設(shè)備上下文外,還負(fù)責(zé)從消息隊(duì)列中清除WM_PAINT消息。因此,在處理窗口重畫(huà)時(shí),必須使用CPaintDC,否則WM_PAINT消息無(wú)法從消息隊(duì)列中清除,將引起不斷的窗口重畫(huà)。CPaintDC也只能用在WM_PAINT消息處理之中。CWindowDC用于窗口客戶區(qū)和非客戶區(qū)(包括窗口邊框、標(biāo)題欄、控制按鈕等)的繪制。除非要自己繪制窗口邊框和按鈕(如一些CD播放程序等),否則一般不用它。CMetaFileDC專(zhuān)門(mén)用于圖元文件的繪制。圖元文件記錄一組GDI命令,可以通過(guò)這一組GDI命令重建圖形輸出。使用CMetaFileDC時(shí),所有的圖形輸出命令會(huì)自動(dòng)記錄到一個(gè)與CMetaFileDC相關(guān)的圖元文件中。 3.2圖形對(duì)象類(lèi)圖形對(duì)象類(lèi)包括CGdiObject、畫(huà)筆、刷子、字體、位圖、調(diào)色板、區(qū)域等。CGdiObject是圖形對(duì)象類(lèi)的基類(lèi),但該類(lèi)不能直接為應(yīng)用程序所使用。要使用GDI對(duì)象,必須使用它的派生類(lèi):畫(huà)筆、刷子、字體、位圖、區(qū)域等等。使用圖形對(duì)象要注意兩點(diǎn):1.同其他MFC對(duì)象一樣,GDI對(duì)象的創(chuàng)建也要分為兩步:第一步,是定義一個(gè)GDI繪圖對(duì)象類(lèi)的實(shí)例;第二步調(diào)用該對(duì)象的創(chuàng)建方法真正創(chuàng)建對(duì)象。2.創(chuàng)建對(duì)象:使用該對(duì)象,首先要調(diào)用CDC:SelectObject()將它選入到設(shè)備上下文中,同時(shí)保存原來(lái)的設(shè)置到一個(gè)GDI對(duì)象指針比如說(shuō)pOldObject中。在使用完后,再用SelectObject(pOldObject)恢復(fù)原來(lái)的設(shè)置。但是,如果該設(shè)備上下文是用戶自己創(chuàng)建的,則不必恢復(fù)原來(lái)設(shè)置,因?yàn)榭蚣軙?huì)在該設(shè)備上下文生存期結(jié)束時(shí)刪除該設(shè)備上下文,同時(shí)也就刪除了原來(lái)存放于該設(shè)備上下文中的繪圖對(duì)象設(shè)置。3.3 圖形對(duì)象的用法畫(huà)筆(CPen):封裝GDI畫(huà)筆,可被選中設(shè)備上下文中當(dāng)前所用得筆。畫(huà)筆用于繪制對(duì)象的邊框以及直線和曲線。缺省畫(huà)筆畫(huà)一條與一個(gè)像素等寬的黑色實(shí)線。要使用畫(huà)筆,首先要定義一個(gè)畫(huà)筆:CPen pen;然后創(chuàng)建畫(huà)筆。創(chuàng)建畫(huà)筆有兩種方法:一是使用CPen:CreatePen(int nPenStyle,int nWidth,DWORD crColor)進(jìn)行初始化。第一個(gè)參數(shù)是筆的風(fēng)格。nPenStyle可選值有:PS_SOLID 實(shí)線;PS_DOT 虛線;PS_INSIDEFRAME 在一個(gè)封閉形狀的框架內(nèi)畫(huà)線,若設(shè)定的顏色不能在調(diào)色板種找到且線寬大于1,Windows會(huì)使用一種混色;PS_NULL 空的畫(huà)筆,什么也不畫(huà)。第二個(gè)參數(shù)是線的寬度,按邏輯單位。若線寬設(shè)為0,則不管是什么映射模式下,線寬始終為一個(gè)像素。第三個(gè)參數(shù)是線的顏色,可以選16種VGA顏色中的一種。顏色的設(shè)置用一個(gè)RGB宏來(lái)指定。RGB宏形式如下COLORREF RGB(cRed,cGreen,cBlue)cRed、cGreen、cBlue分別代表顏色的RGB三個(gè)分量,它們的取值在0-255之間??梢允褂肦GB組合成各種色彩。但是,這種表示法并不是很直觀,因此我們把常見(jiàn)的RGB組合定義成新的宏并放在一個(gè)colors.h中,如清單1。清單1 常見(jiàn)色彩定義/*COLORS.H -常見(jiàn)色彩定義 */#ifndef _COLORS_H#define _COLORS_H/Main Colors#define WHITE RGB(255,255,255)#define BLACK RGB(0,0,0)#define DK_GRAY RGB(128,128,128)#define LT_GRAY RGB(192,192,192)#endif刷子(CBrush):封裝GDI刷子,可用作設(shè)備上下文中當(dāng)前刷子。刷子用來(lái)填充一個(gè)封閉圖形對(duì)象(如矩形、橢圓)的內(nèi)部區(qū)域。缺省的刷子將封閉圖形的內(nèi)部填充成全白色。我們以前所創(chuàng)建的窗口內(nèi)部都是白色就是窗口使用缺省刷子填充的結(jié)果??梢杂靡韵聨追N方法創(chuàng)建刷子:(1)CreateSolidBrush(DWORD crColor)創(chuàng)建一個(gè)實(shí)心刷子,用一種顏色填充一個(gè)內(nèi)部區(qū)域。(2)CreateHatchBrush(int nIndex,DWORD crColor);創(chuàng)建一個(gè)帶陰影的刷子,nIndex代表一種影線模式:(3)用CreatePatternBrush(CBitmap* pBitmap)用一個(gè)位圖作刷子,一般采用8X8的位圖,因?yàn)樗⒆涌梢钥醋?X8的小位圖。當(dāng)Windows桌面背景采用圖案(如weave)填充時(shí),使用的就是這種位圖刷子。(4)同樣可以使用SelectStockObject()從庫(kù)存刷子中選取一個(gè):BLACK_BRUSH 黑色刷子;WHITE_BRUSH 白色刷子;DKGRAY_BRUSH 暗灰刷子;GRAY_BRUSH 灰色刷子;LTGRAY_BRUSH 淡灰色刷子;NULL_BRUSH 空刷子,內(nèi)部不填充字體(CFont):封裝了GDI字體對(duì)象,用戶可以建立一種GDI字體,并使用CFont的成員函數(shù)來(lái)訪問(wèn)它。關(guān)于CFont類(lèi),我們?cè)谇懊嬉呀?jīng)作了一些介紹,這里不再贅述,讀者可以參見(jiàn)前一章內(nèi)容。位圖(CBitmap):封裝一GDI位圖,它提供成員函數(shù)裝載和操作位圖。調(diào)色板(CPalette):封裝GDI調(diào)色板,它保存著系統(tǒng)可用的色彩信息,是應(yīng)用程序和彩色輸出設(shè)備上下文的接口。區(qū)域CRgn類(lèi):封裝GDI區(qū)域。區(qū)域是窗口內(nèi)的一塊多邊形或橢圓形的區(qū)域。CRgn用于設(shè)備環(huán)境(通常是窗口)內(nèi)的區(qū)域操作。CRgn通常與CDC的有關(guān)剪裁(clipping)的成員函數(shù)配合使用。3.4 常見(jiàn)的繪圖任務(wù)輸出文本字體大小計(jì)算:通過(guò)調(diào)用GetTextMetrics()返回當(dāng)前使用字體的尺寸描述,如前面文本編輯所演示的那樣。字體顏色設(shè)置:設(shè)置前景色:CDC:SetTextColor(int nColor);設(shè)置背景色:CDC:SetBkColor(int nColor);例如:dc.SetTextColor(WHITE);dc.SetBkColor(DK_BLUE);dc.TextOut(10,10,“White Text on blue background”,30);除了我們前面介紹的文本輸出函數(shù)TextOut()之外,還有其他幾個(gè)函數(shù)可用于文本輸出:TabbedTextOut:象TextOut一樣顯示正文,但用指定的制表間隔擴(kuò)充制表鍵Tab。 在前面的文本編輯器中,當(dāng)輸入一個(gè)Tab時(shí),TextOut在屏幕上輸出一個(gè)黑色方塊。ExtTextOut:在指定的矩形中顯示正文??梢杂迷摵瘮?shù)刪去超出矩形的正文,用正 文背景填充矩形,調(diào)整字符間隔。DrawText:在指定矩形種顯示正文,可以用這個(gè)函數(shù)擴(kuò)展制表鍵Tab。在格式化矩 形時(shí)調(diào)整正文左對(duì)齊、右對(duì)齊或居中;還可以在一個(gè)詞中斷開(kāi)以適應(yīng)矩形邊界。畫(huà)點(diǎn)SetPixel在指定坐標(biāo)處按指定色彩畫(huà)一點(diǎn)。畫(huà)線MoveToEx將直線起點(diǎn)移動(dòng)到指定坐標(biāo)處,LineTo從起點(diǎn)開(kāi)始畫(huà)直線到終點(diǎn)處。使用的線型由當(dāng)前所用畫(huà)筆指定。畫(huà)弧Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);封閉圖形矩形Rectangle圓角矩形RoundRect()Ellipse在一個(gè)矩形內(nèi)畫(huà)橢圓Chord弦形圖Pie畫(huà)餅形圖Polygon生成封閉的多邊形PolyPolygon畫(huà)完整的一組多邊形其它常用的繪圖函數(shù)FillRect:用指定顏色填充矩形且不畫(huà)邊線Draw3dRect:這是一個(gè)非常實(shí)用的函數(shù),用于繪制各種3D邊框。它的函數(shù)原型如下:void Draw3dRect( LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight );void Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight );通過(guò)設(shè)置上下邊框的顏色clrTopLeft和clrBottomRight,可以繪制出凸出或 凹陷等各種效果的3D邊框。DrawFocusRect:用點(diǎn)線畫(huà)一個(gè)矩形框,內(nèi)部不填充,邊線是用于屏幕上當(dāng)前色的相反色畫(huà)出來(lái)的,故第二次畫(huà)時(shí),會(huì)擦除原來(lái)所畫(huà)的線。ExtFloodFill:用給定的顏色,利用當(dāng)前刷子填充表面被一個(gè)邊線包圍的區(qū)域,用戶可以有選擇地填充一個(gè)由指定顏色組成的區(qū)域。FloodFill:用給定的顏色,利用當(dāng)前所選的刷子填充顯示的底面被一個(gè)邊線所包圍的區(qū)域,如多邊形區(qū)域的填充。FrameRect:繪制矩形邊框時(shí)內(nèi)部不填充。InvertRect:在某一矩形區(qū)域內(nèi)反顯現(xiàn)有顏色。4對(duì)話框的創(chuàng)建 4.1無(wú)模式對(duì)話框的創(chuàng)建無(wú)模式對(duì)話框與有模式對(duì)話框不同的是在創(chuàng)建后其他窗口都可以繼續(xù)接收用戶輸入,因此無(wú)模式對(duì)話框有些類(lèi)似一個(gè)彈出窗口。創(chuàng)建無(wú)模式對(duì)話框需要調(diào)用 BOOL CDialog:Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后還需要調(diào)用 BOOL CDialog:ShowWindow( SW_SHOW);進(jìn)行顯示,否則無(wú)模式對(duì)話框?qū)⑹遣豢梢?jiàn)的。相關(guān)代碼如下: void CYourView:OnOpenDlg(void) /*假設(shè)IDD_TEST_DLG為已經(jīng)定義的對(duì)話框資源的ID號(hào)*/ CTestDlg *dlg=new CTestDlg; dlg-Create(IDD_TEST_DLG,NULL); dlg-ShowWindows(SW_SHOW); /*不要調(diào)用 delete dlg;*/ 在上面的代碼中新生成了一個(gè)對(duì)話框?qū)ο?,而且在退出函?shù)時(shí)并沒(méi)有銷(xiāo)毀該對(duì)象。因?yàn)槿绻藭r(shí)銷(xiāo)毀該對(duì)象(對(duì)象被銷(xiāo)毀時(shí)窗口同時(shí)被銷(xiāo)毀),而此時(shí)對(duì)話框還在顯示就會(huì)出現(xiàn)錯(cuò)誤。那么這就提出了一個(gè)問(wèn)題:什么時(shí)候銷(xiāo)毀該對(duì)象。使用的方法有兩個(gè): 在對(duì)話框退出時(shí)銷(xiāo)毀自己:在對(duì)話框中重載OnOK與OnCancel在函數(shù)中調(diào)用父類(lèi)的同名函數(shù),然后調(diào)用DestroyWindow()強(qiáng)制銷(xiāo)毀窗口,在對(duì)話框中映射WM_DESTROY消息,在消息處理函數(shù)中調(diào)用delete this;強(qiáng)行刪除自身對(duì)象。相關(guān)代碼如下: void CTestDlg1:OnOK() CDialog:OnOK(); DestroyWindow(); void CTestDlg1:OnCancel() CDialog:OnCancel(); DestroyWindow(); void CTestDlg1:OnDestroy() CDialog:OnDestroy(); AfxMessageBox(call delete this); delete this; 這種方法的要點(diǎn)是在窗口被銷(xiāo)毀的時(shí)候,刪除自身對(duì)象。所以你可以在任何時(shí)候調(diào)用DestroyWindow()以達(dá)到徹底銷(xiāo)毀自身對(duì)象的作用。(DestroyWindow()的調(diào)用會(huì)引起OnDestroy()的調(diào)用) 通過(guò)向父親窗口發(fā)送消息,要求其他窗口對(duì)其進(jìn)行銷(xiāo)毀:首先需要定義一個(gè)消息用于進(jìn)行通知,然后在對(duì)話框中映射WM_DESTROY消息,在消息處理函數(shù)中調(diào)用消息發(fā)送函數(shù)通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射處理消息的函數(shù),并在消息處理函數(shù)中刪除對(duì)話框?qū)ο?。相關(guān)代碼如下: /*更改對(duì)話框的有關(guān)文件*/ CTestDlg2:CTestDlg2(CWnd* pParent /*=NULL*/) : CDialog(CTestDlg2:IDD, pParent) /*m_pParent為一成員變量,用于保存通知窗口的指針,所以該指針不能是一個(gè)臨時(shí)指針*/ ASSERT(pParent); m_pParent=pParent; /AFX_DATA_INIT(CTestDlg2) / NOTE: the ClassWizard will add member initialization here /AFX_DATA_INIT void CTestDlg2:OnOK() CDialog:OnOK(); DestroyWindow(); void CTestDlg2:OnCancel() CDialog:OnCancel(); DestroyWindow(); void CTestDlg2:OnDestroy() CDialog:OnDestroy(); /*向其他窗口發(fā)送消息,將自身指針作為一個(gè)參數(shù)發(fā)送*/ m_pParent-PostMessage(WM_DELETE_DLG,(WPARAM)this); /*在消息接收窗口中添加消息映射*/ /*在頭文件中添加函數(shù)定義*/ afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP); /*添加消息映射代碼*/ ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg) END_MESSAGE_MAP() /*實(shí)現(xiàn)消息處理函數(shù)*/ LONG CMy53_s1View:OnDelDlgMsg(WPARAM wP,LPARAM lP) delete (CTestDlg2*)wP; return 0; /*創(chuàng)建對(duì)話框*/ void CMy53_s1View:OnTest2() CTestDlg2 *dlg=new CTestDlg2(this); dlg-Create(IDD_TEST_DLG_2); dlg-ShowWindow(SW_SHOW); 在這種方法中利用消息來(lái)進(jìn)行通知,在Window系統(tǒng)中利用消息進(jìn)行通知和傳遞數(shù)據(jù)的用法是很多的。 同樣無(wú)模式對(duì)話框的另一個(gè)作用還可以用來(lái)在用戶在對(duì)話框中的輸入改變時(shí)可以及時(shí)的反映到其他窗口。下面的代碼演示了在對(duì)話框中輸入一段文字,然后將其更新到視圖的顯示區(qū)域中,這同樣也是利用了消息進(jìn)行通知和數(shù)據(jù)傳遞。 /*在對(duì)話框中取出數(shù)據(jù),并向其他窗口發(fā)送消息和數(shù)據(jù),將數(shù)據(jù)指針作為一個(gè)參數(shù)發(fā)送*/ void CTestDlg2:OnCommBtn() char szOut30; GetDlgItemText(IDC_OUT,szOut,30); m_pParent-SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut); /*在消息接收窗口中*/ /*映射消息處理函數(shù)*/ ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg) /*在視圖中繪制出字符串 m_szOut*/ void CMy53_s1View
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江漢藝術(shù)職業(yè)學(xué)院《社會(huì)調(diào)查與實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年制造業(yè)智能制造關(guān)鍵零部件市場(chǎng)分析報(bào)告
- 廢紙?jiān)偕阅芴嵘?洞察及研究
- 浙江師范大學(xué)行知學(xué)院《局部解剖學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 首都師范大學(xué)科德學(xué)院《英語(yǔ)泛讀(4)》2023-2024學(xué)年第一學(xué)期期末試卷
- 晉中信息學(xué)院《幼兒美術(shù)賞析》2023-2024學(xué)年第一學(xué)期期末試卷
- 美食旅游趨勢(shì)分析-洞察及研究
- 2025年制造業(yè)數(shù)字化轉(zhuǎn)型深度研究報(bào)告
- 紡織環(huán)保法規(guī)研究-洞察及研究
- 小學(xué)向國(guó)旗敬禮活動(dòng)方案
- 2025年江蘇啟東市勞務(wù)技術(shù)經(jīng)濟(jì)開(kāi)發(fā)有限公司招聘筆試參考題庫(kù)含答案解析
- 房屋市政工程施工現(xiàn)場(chǎng)安全風(fēng)險(xiǎn)分級(jí)管控與防范措施清單
- 山西焦煤招聘筆試題庫(kù)2025
- DB50-T 1808-2025“一表通”智能報(bào)表市級(jí)業(yè)務(wù)數(shù)據(jù)規(guī)范
- 房屋市政工程生產(chǎn)安全重大事故隱患判定檢查表(2024版)
- 高企研發(fā)費(fèi)用培訓(xùn)
- 飼料公司銷(xiāo)售管理制度
- 物業(yè)維修電工培訓(xùn)內(nèi)容
- 深圳輔警考試試卷真題及答案
- 廠房屋頂光伏項(xiàng)目可行性分析報(bào)告
- 中醫(yī)診斷學(xué)課件(修改后)課件 中醫(yī)診斷學(xué)-緒論學(xué)習(xí)資料
評(píng)論
0/150
提交評(píng)論