圖形學實驗指導書.doc_第1頁
圖形學實驗指導書.doc_第2頁
圖形學實驗指導書.doc_第3頁
圖形學實驗指導書.doc_第4頁
圖形學實驗指導書.doc_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

最新文檔

評論

0/150

提交評論