版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
3.1VisualC++軟件設(shè)計(jì)方法3.2圖形編程基礎(chǔ)3.3在視圖內(nèi)繪圖3.4映射模式3.5OpenGL圖形標(biāo)準(zhǔn)1.1計(jì)算機(jī)圖形學(xué)的研究?jī)?nèi)容3.1.1開發(fā)環(huán)境和開發(fā)工具概述VisualC++6.0開發(fā)環(huán)境DeveloperStudio是由運(yùn)行在Windows環(huán)境下的一套集成工具組成的,包含輸入程序源代碼的文本編輯器(TextEditor)、設(shè)計(jì)用戶界面(如菜單、對(duì)話框、圖標(biāo)等)的資源編輯器(ResourcesEditor)、跟蹤源文件和建立項(xiàng)目配置的項(xiàng)目管理器(ProjectBuildFacilities)、建立并運(yùn)行程序的優(yōu)化編譯器(OptimizingCompiler)和增量連接器(IncrementalLinker)以及檢查程序錯(cuò)誤的集成調(diào)試器(IntegratedDebugger)等。VisualC++6.0提供具有強(qiáng)大功能的向?qū)Чぞ逜ppWizard和ClassWizard來簡(jiǎn)化Win32圖形程序的開發(fā)。AppWizard向?qū)в糜趲椭脩羯筛鞣N不同類型應(yīng)用程序的基本框架,生成完整的從開始文件出發(fā)的基于MFC類庫的源文件和資源文件。在創(chuàng)建應(yīng)用程序的基本框架后,使用ClassWizard來創(chuàng)建新類、定義消息處理函數(shù)、重載虛擬函數(shù)和從對(duì)話框的控件中獲取數(shù)據(jù)并驗(yàn)證數(shù)據(jù)的合法性。VisualC++6.0的DeveloperStudio為標(biāo)準(zhǔn)的Windows界面,由標(biāo)題欄、菜單欄、工具欄、工作區(qū)窗口、源代碼編輯窗口、輸出窗口和狀態(tài)欄組成,如圖3-1所示。屏幕的最上端是標(biāo)題欄,標(biāo)題欄用于顯示應(yīng)用程序名和所打開的文件名。標(biāo)題欄左端為控制菜單框,用于控制窗口的大小和位置。標(biāo)題欄右端有3個(gè)控制按鈕,分別為最小化按鈕、還原按鈕和關(guān)閉按鈕,這些按鈕用于快速設(shè)置窗口大小。標(biāo)題欄的下面是菜單欄和工具欄。菜單欄由多個(gè)菜單組成,包含著VisualC++6.0的絕大部分功能,是日常工作不可缺少的主要工具之一。工具欄由某些操作按鈕組成,分別對(duì)應(yīng)某些菜單選項(xiàng)或命令的功能,可直接用鼠標(biāo)單擊這些按鈕來完成指定的功能。默認(rèn)時(shí),屏幕工具欄區(qū)域顯示有兩個(gè)工具欄,即Standard工具欄和Build工具欄。工具欄的下面是兩個(gè)窗口,一個(gè)是工作區(qū)窗口,另一個(gè)是源代碼編輯窗口。工作區(qū)窗口的下面是輸出窗口,用于顯示項(xiàng)目建立過程中所產(chǎn)生的錯(cuò)誤信息。屏幕最底端是狀態(tài)欄,顯示當(dāng)前操作或所選命令的提示信息。3.1.2實(shí)用AppWizard生成一個(gè)圖形應(yīng)用重要程序的框架AppWizard(程序生成向?qū)В┛蔀槭褂肕FC的典型C++Windows應(yīng)用程序建立開發(fā)項(xiàng)目,它提供了一系列對(duì)話框及多種選項(xiàng),用戶可以根據(jù)不同的選項(xiàng)生成自己所需的具有各種特征的應(yīng)用程序框架。具體步驟如下:步驟1:選擇File→New命令,在New對(duì)話框中選擇Projects選項(xiàng)卡,選擇MFCAppWizard(.exe)。在Location文件框中,可直接輸入目錄名稱,或者單擊“...”按鈕選擇已有的目錄。在Projectname文本框中輸入項(xiàng)目名稱,此時(shí)OK按鈕變亮,單擊后彈出MFCAppWizard-Step1對(duì)話框,如圖3-2所示。選中Singledocuments單選按鈕和“中文\[簡(jiǎn)體,中國\]”選項(xiàng),單擊Next按鈕,進(jìn)入下一步驟。步驟2:該步驟用于決定應(yīng)用程序是否需要數(shù)據(jù)庫支持。一般圖形程序不需要數(shù)據(jù)庫支持,因此選中默認(rèn)值None選項(xiàng)即可。步驟3:該步驟用于決定應(yīng)用程序是否需要復(fù)合文檔支持。一般圖形程序需要服務(wù)器型的復(fù)合文檔支持,因此選擇FullSever選項(xiàng)即可。步驟4:選擇None單選按鈕,并單擊Next按鈕,出現(xiàn)MFCAppWizard-Step4of6對(duì)話框,如圖3-3所示。步驟5:在該步驟中采用默認(rèn)設(shè)置。步驟6:?jiǎn)螕鬘ext按鈕,出現(xiàn)MFCAppWizard-Step6of6對(duì)話框,如圖3-4所示。對(duì)話框中的默認(rèn)設(shè)置確定了類的名稱及其所在文件的名稱。在對(duì)話框中,單擊Finish按鈕,AppWizard顯示將要?jiǎng)?chuàng)建的文件清單。3.1.3實(shí)用資源編輯器生成圖形用戶界面資源作為一種界面成分,可以從中獲取信息并在其中執(zhí)行某種動(dòng)作。VisualC++.Net可以處理的資源有加速鍵(Accelerator)、位圖(Bitmap)、光標(biāo)(Cursor)、對(duì)話框(DialogBox)、圖標(biāo)(Icon)、菜單(Menu)、串表(StringTable)、工具欄(Toolbar)和版本信息(VersionInformation)等。DeveloperStudio可提供功能強(qiáng)大且易于使用的資源編輯器,用于創(chuàng)建和修改應(yīng)用程序的資源。使用資源編輯器可以創(chuàng)建新的資源,修改、復(fù)制已有的資源以及刪除不再需要的資源。例如,用加速鍵編輯器處理加速表、用圖形編輯器處理圖形資源(工具欄、位圖、光標(biāo)和圖標(biāo)等)、用對(duì)話編輯器處理對(duì)話框、用菜單編輯器處理菜單等。創(chuàng)建或者打開資源時(shí),系統(tǒng)將自動(dòng)打開應(yīng)用的編輯器。編輯器打開后,單擊鼠標(biāo)右鍵,將彈出快捷菜單,其中列有與當(dāng)前資源有關(guān)的命令。1.創(chuàng)建的資源選擇Insert→Resource命令,彈出InsertResource對(duì)話框,如圖3-5所示。如果要?jiǎng)?chuàng)建新的資源,則從Resourcetype列表框中選擇資源類型,然后點(diǎn)擊New按鈕。新創(chuàng)建的資源將加入到當(dāng)前資源文件中。2.查看和修改資源可以使用項(xiàng)目工作區(qū)窗口的ResourceView面板來查看和修改資源,如圖3-6所示。首次打開ResourceView面板時(shí),系統(tǒng)將自動(dòng)壓縮每個(gè)資源分類,可單擊“+”標(biāo)記來擴(kuò)展每一分類??梢允褂貌藛蚊顏韽?fù)制、移動(dòng)、粘貼或者刪除資源,也可以通過雙擊打開相應(yīng)的編輯器來修改資源,還可以用資源屬性對(duì)話框來修改資源的語言屬性或條件屬性。3.導(dǎo)入位圖、光標(biāo)和圖標(biāo)VisualC++6.0可以將單獨(dú)的位圖、光標(biāo)或圖標(biāo)文件導(dǎo)入資源文件中,方法為:(1)在ResourceView面板中單擊鼠標(biāo)右鍵,從快捷菜單中選擇Import命令,彈出ImportResource對(duì)話框。(2)在對(duì)話框選擇要導(dǎo)入的.BMP(位圖)、.ICO(圖標(biāo))或.CUR(光標(biāo))文件。(3)選擇后單擊Import按鈕即可將文件添加到當(dāng)前資源文件中。此外,還可以使用快捷菜單中的Export命令將位圖、光標(biāo)或圖標(biāo)從資源文件導(dǎo)出到單獨(dú)的文件中。4.資源模板除了創(chuàng)建資源文件外,還可以創(chuàng)建資源模板。資源模板創(chuàng)建后,就可以在資源模板的基礎(chǔ)上創(chuàng)建新的資源。資源模板的創(chuàng)建方法與資源文件的創(chuàng)建方法基本相同,不同處在于它必須使用File菜單中的SaveAs命令將資源模板保存在Devstudio\\ShareIDE\\Template文件夾中。5.資源符號(hào)資源符號(hào)由映射到整數(shù)值上的文本串組成,用于在源代碼或資源編輯器中引用資源或?qū)ο?。在?chuàng)建新的資源或?qū)ο髸r(shí),系統(tǒng)自動(dòng)為其提供默認(rèn)符號(hào)名(如IDD_ABOUTBOX)和符號(hào)值。默認(rèn)時(shí),符號(hào)名和符號(hào)值自動(dòng)保存在系統(tǒng)生成的資源文件resource.h中。可以使用資源屬性對(duì)話框來改變資源的符號(hào)名或符號(hào)值,方法為:(1)在ResourceView面板中選擇要處理的資源。(2)選擇View→Properties命令或按Alt+Enter鍵,彈出相應(yīng)的資源屬性對(duì)話框,如圖3-7所示。(3)在ID文本框中輸入新的符號(hào)或符號(hào)值,或從已有的符號(hào)列表中選擇一種符號(hào)。如果輸入新的符號(hào)名,則系統(tǒng)會(huì)自動(dòng)為其賦值。也可以在文本編輯器中直接修改resource.h文件來改變與多個(gè)資源有關(guān)的符號(hào)。符號(hào)名通常用帶有描述性的前綴來表示所代表的資源或?qū)ο箢愋汀7?hào)值通常有一定的限制。使用資源符號(hào)瀏覽器(通過選擇View→ResourceIncludes命令來啟動(dòng))可以簡(jiǎn)化資源符號(hào)的管理,可以快速瀏覽已有資源符號(hào)的定義,創(chuàng)建、更改和刪除資源符號(hào),快速切換到某個(gè)資源對(duì)應(yīng)的編輯器中。3.1.4利用消息映射和消息處理交互式繪圖所有Windows應(yīng)用程序都是由消息驅(qū)動(dòng)的,當(dāng)用戶單擊鼠標(biāo)或改變窗口大小時(shí),都將給適當(dāng)?shù)拇翱诎l(fā)送消息。每個(gè)消息都對(duì)應(yīng)于某個(gè)特定的事件。圖形軟件通過處理鼠標(biāo)和鍵盤等Windows消息,實(shí)現(xiàn)交互式繪圖。1.消息的種類消息主要是指由用戶操作并向應(yīng)用程序發(fā)出的信息,也包括操作系統(tǒng)內(nèi)部產(chǎn)生的消息。例如,點(diǎn)擊鼠標(biāo)左鍵,Windows將產(chǎn)生WM_LBUTTONDOWN消息,而釋放鼠標(biāo)左鍵將產(chǎn)生WM_LBUTTONUP消息,按下鍵盤上的字母鍵,將產(chǎn)生WM_CHAR消息。在VC中,消息主要有三種類型,即Windows消息、控件通知和命令消息。(1)Windows消息。除了WM_COMMAND外,所有以WM_為前綴的消息都是Windows消息。Windows消息由窗口和視圖處理。這類消息通常含有用于確定如何對(duì)消息進(jìn)行處理的一些參數(shù)。(2)控件通知??丶ㄖ瑥目丶推渌翱趥魉徒o父窗口的WM_COMMAND通知消息。窗口的消息處理函數(shù)將以適當(dāng)?shù)姆绞綄?duì)通知消息作出響應(yīng),如獲取編輯控件中的文本。像其他標(biāo)準(zhǔn)Windows消息一樣,控件通知消息也由窗口和視圖處理。但是,用戶單擊按鈕控件時(shí)發(fā)出的BN_CLICKED控制通知消息將作為命令消息來處理。(3)命令消息。命令消息包含來自用戶界面對(duì)象的WM_COMMAND通知消息。菜單項(xiàng)、工具欄按鈕和加速鍵都是可以產(chǎn)生命令的用戶界面對(duì)象。每個(gè)這樣的對(duì)象都有一個(gè)ID,通過給對(duì)象和命令分配同一個(gè)ID可以把用戶界面對(duì)象與命令聯(lián)系起來。正如在“消息”中所說的那樣,命令是被當(dāng)作特殊的消息來處理的。通常,命令I(lǐng)D是以其所表示的用戶界面對(duì)象的功能來命令的。MFC類庫預(yù)定義了某些命令I(lǐng)D(如ID_EDIT_PASTE、ID_FILE_OPEN等),而其他命令I(lǐng)D需則要編程人員自己定義。所有預(yù)定義命令I(lǐng)D的列表可參見afxres.h文件。命令消息的處理與其他消息的處理不同,命令消息可以被更廣泛的對(duì)象(如文檔、文檔模板、應(yīng)用程序?qū)ο?、窗口和視圖等)處理。Windows把命令發(fā)送給多個(gè)候選對(duì)象,稱為命令目標(biāo),通常其中的一個(gè)對(duì)象有針對(duì)該命令的處理函數(shù)。處理函數(shù)處理命令的方法與處理Windows消息的方法是一樣的,但調(diào)用機(jī)制不一樣。2.消息處理在MFC中,每個(gè)專門的處理函數(shù)單獨(dú)處理每個(gè)消息,編寫消息處理函數(shù)是編寫框架應(yīng)用程序的主要任務(wù)??梢允褂肅lassWizard創(chuàng)建消息處理函數(shù),然后從ClassWizard直接跳到源文件消息處理函數(shù)的定義部分,并從中編寫消息處理函數(shù)的代碼。(1)Windows消息和控件通知的處理函數(shù)。Windows消息和控件通知都是由派生于CWnd的窗口類對(duì)象處理的。它們包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及從這些類派生的用戶自定義的類。這樣的類對(duì)象封裝了Windows窗口的句柄HWND。Windows消息和控件通知都有默認(rèn)的處理函數(shù),這些函數(shù)在CWnd類中進(jìn)行了預(yù)定義。MFC類庫以消息名為基礎(chǔ)形成這些處理函數(shù)的名稱,這些名稱都以前綴On開始。有的處理函數(shù)不帶參數(shù),有的則有幾個(gè)參數(shù),有的還有除了void以外的返回值類型。CWnd中消息處理函數(shù)的說明都有afx_msg前綴。關(guān)鍵字afx_msg用于把處理函數(shù)與其他CWnd成員函數(shù)區(qū)分開來。常見的Windows消息有鼠標(biāo)消息(如WM_LBUTTONDOWN消息)、鍵盤字符消息(WM_CHAR消息)、鍵盤按鍵消息(WM_KEYDOWN)、窗口重畫消息(WM_PAINT消息)、水平和垂直滾動(dòng)消息(WM_HSCROLL消息和WM_VSCROLL消息)以及系統(tǒng)時(shí)鐘消息(WM_TIMER消息)等。(2)命令消息的處理函數(shù)。由于用戶界面對(duì)象是由用戶定義的,每個(gè)應(yīng)用程序的用戶界面對(duì)象千差萬別,所以來自用戶界面對(duì)象的命令消息沒有默認(rèn)的處理函數(shù)。如果某條命令直接影響某個(gè)特定的對(duì)象,則應(yīng)讓該對(duì)象來處理這條命令。例如,F(xiàn)ile菜單中的Open命令與應(yīng)用程序有關(guān),所以,Open命令的處理函數(shù)是應(yīng)用程序類的一個(gè)成員函數(shù)。把命令消息映射成處理函數(shù)時(shí),ClassWizard以命令I(lǐng)D來命名處理函數(shù),可以接受、修改或替換推薦使用的名稱。命令消息的處理函數(shù)沒有參數(shù),也不返回值。3.消息映射可以接受消息和命令的所有框架類都有自己的消息映射。框架利用消息映射把消息和命令與它們的處理函數(shù)鏈接起來。從CCmdTarget類派生的任何類都可以有消息映射。雖然名為“消息映射”,但消息映射既可以處理消息,也可以處理命令,包括在“消息種類”中列出的三種消息種類。用MFCAppWizard創(chuàng)建應(yīng)用程序框架時(shí),AppWizard為創(chuàng)建的每個(gè)命令目標(biāo)類(包括派生的應(yīng)用程序?qū)ο?、文檔、視圖和邊框窗口等)編寫一個(gè)消息映射。每個(gè)命令目標(biāo)類的消息映射存放在應(yīng)用的.cpp文件中。可以在AppWizard創(chuàng)建基本消息映射的基礎(chǔ)上,使用ClassWizard為每個(gè)類將處理的消息和命令添加一些條目。每個(gè)命令目標(biāo)類的消息映射都由一組預(yù)定義的宏組成,稱為映射宏。其中,宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP用于將消息映射括起來,其他宏(如ON_COMMAND)則包含有消息映射的內(nèi)容。宏的格式依消息類型而定,宏內(nèi)部的兩個(gè)參數(shù)即為消息和消息處理函數(shù)。表3-1列出了MFC預(yù)定義的消息映射宏。應(yīng)注意的是,消息映射宏后面不能帶有分號(hào)。此外,消息映射還包括以下形式的注釋://{{AFX_MSG_MAP(CDrawApp)//}}AFX_MSG_MAP4.利用消息處理函數(shù)實(shí)現(xiàn)交互式繪圖交互式繪圖是指應(yīng)用輸入設(shè)備與交換技術(shù)進(jìn)行可視的、動(dòng)態(tài)的圖形繪制。交互技術(shù)包括定位技術(shù)、橡皮條技術(shù)、拖動(dòng)技術(shù)、菜單技術(shù)、定值技術(shù)、拾取技術(shù)和捕捉技術(shù)。這些交互技術(shù)都是依賴輸入設(shè)備而實(shí)現(xiàn)的。3.2圖形編程基礎(chǔ)3.2.1圖形設(shè)備接口圖形設(shè)備接口(GraphicsDeviceInterface,GDI),表示的是一個(gè)抽象的接口。換句話說,就是相當(dāng)于一個(gè)關(guān)于圖形顯示的函數(shù)庫。通過該接口可以實(shí)現(xiàn)對(duì)圖形的顏色、線條等屬性的控制。程序可以通過調(diào)用這些GDI函數(shù)和硬件打交道,從而實(shí)現(xiàn)設(shè)備無關(guān)性。也就是說,對(duì)于Windows編程不允許直接訪問顯示硬件,必須通過和特定窗口相關(guān)聯(lián)的“設(shè)備環(huán)境”與顯示硬件進(jìn)行通信。因此,各種GDI函數(shù)會(huì)自動(dòng)參考被稱為“設(shè)備環(huán)境”的數(shù)據(jù)結(jié)構(gòu)進(jìn)行繪制工作。3.2.2設(shè)備環(huán)境設(shè)備環(huán)境(DC)又稱設(shè)備上下文,也稱設(shè)備描述表,實(shí)際上就是一個(gè)關(guān)于如何繪制圖形的方法的集合。它不僅可以繪制各種圖形,還可以確定在應(yīng)用窗口中繪制圖形的方式,即確定繪圖模式和映射模式。用戶在繪圖之前,必須獲取繪圖窗口區(qū)域的一個(gè)DC。接著才能進(jìn)行GDI函數(shù)的調(diào)用,執(zhí)行適合DC的命令。獲取DC時(shí),用戶不必關(guān)心大多數(shù)的屬性,因?yàn)閃indows初始化了一套完整的屬性和對(duì)象集合,用戶可以使用它們渲染顯示。同時(shí),為了創(chuàng)建自己應(yīng)用程序特定顯示,還可以更改這些屬性和對(duì)象。在Windows編程術(shù)語中,給DC提供新對(duì)象的操作被稱為將繪圖對(duì)象選取到DC中。另外,應(yīng)該注意的是,Windows的設(shè)備環(huán)境是GDI的關(guān)鍵元素,它代表了不同的物理設(shè)備,分為顯示器型、打印機(jī)型、內(nèi)存型和信息型4種類型。3.2.3設(shè)備環(huán)境類MFC(Microsoft基本類庫)4.21版本中包含了一些設(shè)備環(huán)境類,其中CDC類包含了繪圖所需的全部成員函數(shù)(包括部分虛函數(shù)),并且除了CMetaFileDC類之外,所有的派生類只有構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義有所不同。在MFC中,提出這些派生類的目的是為了在不同的顯示設(shè)備上進(jìn)行顯示。1)CDC類中常用的成員函數(shù)表3-3所示為CDC類中一些常用的成員函數(shù)。2)CDC類的派生類的功能及其之間的區(qū)別CDC各派生類各有特點(diǎn),并可以完成不同的功能,表3-4介紹了各派生類的主要功能。3)CDC類的具體應(yīng)用顯示器設(shè)備環(huán)境是最常用的設(shè)備環(huán)境。通過對(duì)函數(shù)CWnd::GetDC()、CWnd::GetDCEx()或CWnd::BeginPaint()的調(diào)用,應(yīng)用程序就可以檢取指定窗口的工作區(qū)的顯示器設(shè)備環(huán)境的句柄,可以在后續(xù)的GDI函數(shù)中使用該顯示器設(shè)備環(huán)境在窗口工作區(qū)中畫圖。當(dāng)完成繪圖操作之后,應(yīng)用程序應(yīng)該調(diào)用CWnd::ReleaseDC()和CWnd::EndPaint()函數(shù)來釋放設(shè)備環(huán)境。對(duì)于打印機(jī)設(shè)備環(huán)境,應(yīng)用程序是通過調(diào)用CWnd::CreateDC()函數(shù)來創(chuàng)建的。當(dāng)使用完畢后,應(yīng)該調(diào)用CWnd::DeleteDC()函數(shù)來刪除它。內(nèi)存設(shè)備環(huán)境是通過調(diào)用CWnd::CreateCompatibleDC()函數(shù)來創(chuàng)建的,它將創(chuàng)建一個(gè)與指定設(shè)備有兼容顏色格式的位圖,內(nèi)存設(shè)備環(huán)境也常被稱為兼容設(shè)備環(huán)境。3.2.4GDI對(duì)象GDI是一個(gè)與各種圖形操作有關(guān)的函數(shù)集。在Windows應(yīng)用程序中繪制或編輯圖形時(shí)可以調(diào)用這些函數(shù)。因?yàn)?,在Windows屏幕上看到的任何東西都是圖形,所以在應(yīng)用窗口中每次進(jìn)行顯示和編輯操作時(shí),都必須調(diào)用特定的GDI函數(shù)。Windows的GDI對(duì)象類型是通過MFC庫中的類來表示的,其中CGdiObject類正是所有GDI對(duì)象的抽象基類,其派生類包括CBitmap類、CBrush類、CFont類、CPen類、CRgn類和CPalette類。這些派生類對(duì)于繪制圖形和圖像來說都是非常重要的,編程者經(jīng)常要使用這些類來創(chuàng)建繪圖工具,而很少使用基類CGdiObject。對(duì)于用戶來說根本不需要使用CGdiObject類的對(duì)象,然而,用戶必須使用其派生類的對(duì)象。通常,我們可以使用SelectObject函數(shù)將GDI對(duì)象選進(jìn)設(shè)備環(huán)境。3.2.5DC與GDI設(shè)備之間的關(guān)系設(shè)備環(huán)境和圖形設(shè)備接口是實(shí)現(xiàn)計(jì)算機(jī)繪圖的兩個(gè)重要的組成部分,設(shè)備環(huán)境主要定義了繪圖的狀態(tài)和方式,而圖形設(shè)備接口則主要定義了采用的繪圖工具。3.3在視圖內(nèi)繪圖3.3.1OnDraw成員函數(shù)在視圖內(nèi)繪圖常使用OnDraw函數(shù)。該函數(shù)是CView類中的一個(gè)虛函數(shù),每次需要重新繪制時(shí),應(yīng)用程序框架都會(huì)自動(dòng)調(diào)用OnDraw函數(shù)。當(dāng)用戶改變了窗口尺寸,或者當(dāng)窗口恢復(fù)了先前被遮蓋的部分,或者當(dāng)應(yīng)用程序改變了窗口數(shù)據(jù)時(shí),應(yīng)用程序框架都會(huì)自動(dòng)調(diào)用OnDraw函數(shù)。3.3.2Windows設(shè)備環(huán)境在MFC庫中,設(shè)備環(huán)境是通過C++的CDC類對(duì)象來表示的,該對(duì)象被作為參數(shù)(以指針的形式)傳遞給OnDraw函數(shù)。有了這個(gè)設(shè)備環(huán)境指針,人們就可以直接調(diào)用CDC類中的成員函數(shù)來完成各種各樣的繪制工作了。比如將繪圖函數(shù)加入OnDraw函數(shù)。3.3.3常見繪圖(1)繪制直線。繪制直線可以只用到兩個(gè)有關(guān)CDC類的成員函數(shù):CPointMoveTo(intx,inty);//移動(dòng)當(dāng)前位置到x和y指定的點(diǎn)CPointMoveTo(POINTpoint);//移動(dòng)當(dāng)前位置到point指定的點(diǎn)//該函數(shù)返回前一個(gè)位置坐標(biāo)x和y的值。該位置值被看作為一個(gè)CPoint對(duì)象BOOLLineTo(intx,inty);//從當(dāng)前點(diǎn)向x和y指定的點(diǎn)畫線BOOLLineTo(POINTpoint);//從當(dāng)前點(diǎn)向point指定的點(diǎn)畫線畫線功能就是通過這兩個(gè)函數(shù)來完成的。兩個(gè)函數(shù)配合使用,可以完成任何繪制直線和折線的操作。(2)繪制矩形。繪制矩形的方法很簡(jiǎn)單,主要是調(diào)用CDC類的成員函數(shù)Rectangle,函數(shù)聲明如下:BOOLRectangle(intx1,inty1,intx2,inty2);BOOLRectangle(LPCRECTlpRect);參數(shù)x1和y1,x2和y2分別代表所要繪制的矩形的左上角頂點(diǎn)坐標(biāo)值和右下角頂點(diǎn)坐標(biāo)值。參數(shù)lpRect則指定了所要繪制的矩形區(qū)域。(3)繪制橢圓及圓。繪制橢圓及圓的成員函數(shù)為Ellipse,函數(shù)聲明如下:BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);參數(shù)x1和y1指定了所繪制橢圓的邊界矩形的左上角頂點(diǎn)坐標(biāo)值,參數(shù)x2和y2指定了所繪制橢圓的邊界矩形的右下角頂點(diǎn)坐標(biāo)值。參數(shù)lpRect直接指定了所繪制橢圓的邊界矩形區(qū)域,如圖3-9所示。將如下代碼添加到OnDraw函數(shù)中,便可以實(shí)現(xiàn)分別以指定的圓心繪制橢圓和圓的功能:繪制圓時(shí)可借用橢圓成員函數(shù)Ellipse,圓是橢圓的一種特殊情形,即橢圓邊界矩形為一個(gè)正方形。(4)繪制折線。繪制折線可以使用PolyLine()函數(shù)和PolyLineTo()函數(shù),多邊形可以說是由首尾相連的封閉折線所圍成的圖形。繪制多邊形可以使用函數(shù)Polygon(),其聲明如下:BOOLPolygon(LPPOINTlpPoints,intnCount);參數(shù)lpPoints指向一個(gè)存放多邊形頂點(diǎn)的矩陣。參數(shù)nCount記錄多邊形頂點(diǎn)個(gè)數(shù)。3.4映射模式3.4.1Windows映射模式簡(jiǎn)介Windows提供了幾種映射模式,或稱為坐標(biāo)系,可以通過它們來和設(shè)備坐標(biāo)相聯(lián)系(當(dāng)前映射模式下的坐標(biāo)稱為邏輯坐標(biāo))。表3-5中詳細(xì)介紹了Windows的8種映射模式。MM_TEXT映射模式允許應(yīng)用程序利用設(shè)備像素工作,因此用它來表示設(shè)備坐標(biāo)系再適合不過了。屏幕(窗口)的原點(diǎn)約定在左上點(diǎn),而X和Y方向向右下方增長(zhǎng)。MM_LOMETRIC、MM_HIMETRIC、MM_LONGLISH、MM_HIENGLISH、MM_TWIPS被稱為“固定比例”映射模式。所有固定比例的映射模式的x值向右是遞增的,y值向下是遞減的(即笛卡爾坐標(biāo)系)。它們之間的區(qū)別就在于設(shè)備坐標(biāo)到邏輯坐標(biāo)轉(zhuǎn)換的實(shí)際比例因子不同。值得注意的是,映射模式MM_TWIPS常用于打印機(jī),一個(gè)“twip”單位相當(dāng)于1/20磅(磅是一種度量單位,在Windows中1磅等于1/72英寸)。另外兩種映射模式MM_ISOTROPIC和MM_ANISOTROPIC被稱為“可變比例”映射模式。在這些模式下,我們可以改變它們的比例因子和坐標(biāo)原點(diǎn)。借助于這兩種映射模式,當(dāng)用戶改變了窗口尺寸時(shí),繪制的圖形大小也會(huì)發(fā)生相應(yīng)的變化;同時(shí),如果改變某個(gè)軸的方向,那么所繪制的圖形也會(huì)隨著該軸的變化而發(fā)生改變,并且我們還可以定義任意的比例因子。在MM_ISOTROPIC模式下,X方向與Y方向上的比例因子總是相等的(即縱橫比值為1∶1),而在MM_ANISOTROPIC模式下,X方向與Y方向上的比例因子可以不相等(即縱橫比例任意),因此通過這一特點(diǎn),我們可以很容易地將圓拉伸成橢圓。3.4.2如何設(shè)置映射模式映射模式的設(shè)置比較容易,在VC++中調(diào)用CDC類中的成員函數(shù)SetMapMode即可完成。該函數(shù)的聲明如下:virtualintSetMapMode(intnMapMode);3.5OpenGL圖形標(biāo)準(zhǔn)3.5.1OpenGL簡(jiǎn)介OpenGL是近幾年發(fā)展起來的一個(gè)性能卓越的三維圖形標(biāo)準(zhǔn),它是在SGL等多家世界聞名的計(jì)算機(jī)公司的倡導(dǎo)下,以SGI的GL三維圖形庫為基礎(chǔ)制定的、可以獨(dú)立于窗口操作系統(tǒng)和硬件環(huán)境的、開放式的三維圖形標(biāo)準(zhǔn)。其目的是將用戶從具體的硬件系統(tǒng)和操作系統(tǒng)中解放出來,使他們不必理解這些系統(tǒng)的結(jié)構(gòu)和指令系統(tǒng),只需按規(guī)定的格式書寫應(yīng)用程序即可編寫在任何支持該語言的硬件平臺(tái)上執(zhí)行的程序。OpenGL實(shí)際上是一個(gè)開放式的、與硬件無關(guān)的圖形軟件包,它獨(dú)立于窗口系統(tǒng)和操作系統(tǒng),以它為基礎(chǔ)開發(fā)的應(yīng)用程序,可以運(yùn)行在當(dāng)前各種流行的操作系統(tǒng)之上,如Windows、UNIX、Linux、MacOS、OS/2等,并且能夠方便地在各種平臺(tái)間移植。OpenGL應(yīng)用程序幾乎可以在任何操作系統(tǒng)下運(yùn)行。從個(gè)人計(jì)算機(jī)到工作站和超級(jí)計(jì)算機(jī),都能實(shí)現(xiàn)高性能的三維圖形功能。由于OpenGL具有高度可重用性和靈活性,它已經(jīng)成為高性能圖形和交互式視景處理的工業(yè)標(biāo)準(zhǔn)。OpenGL是一個(gè)專業(yè)的、功能強(qiáng)大且調(diào)用方便的底層三維圖形函數(shù)庫,可用于開發(fā)交互式二維和三維圖形應(yīng)用程序。從真實(shí)感圖形顯示、三維動(dòng)畫、CAD到可視化仿真,都可以用OpenGL開發(fā)出高質(zhì)量、高性能的圖形應(yīng)用程序。OpenGL是一個(gè)圖形與硬件的接口,它由幾百個(gè)函數(shù)組成,僅核心圖形函數(shù)就有一百多個(gè)。OpenGL不要求開發(fā)人員把三維模型數(shù)據(jù)寫成固定的數(shù)據(jù)格式,也不要求開發(fā)人員編寫矩陣變換、外部設(shè)備訪問等函數(shù),從而簡(jiǎn)化了三維圖形程序的編寫。值得一提的是,雖然微軟有自己的三維編程開發(fā)工具DirectX,但它也提供OpenGL圖形標(biāo)準(zhǔn),因此,OpenGL在CAD、虛擬現(xiàn)實(shí)、科學(xué)可視化、娛樂動(dòng)畫等領(lǐng)域得到了廣泛應(yīng)用,尤其適合醫(yī)學(xué)成像、地理信息、石油勘探、氣象模型等應(yīng)用。3.5.2OpenGL的主要特點(diǎn)和功能penGL作為一個(gè)性能優(yōu)越的圖形應(yīng)用程序設(shè)計(jì)接口(API),它主要具有以下9種功能。(1)模型繪制。OpenGL能夠繪制點(diǎn)、線和多邊形。應(yīng)用這些基本形體,可以構(gòu)造出幾乎所有的三維模型。(2)模型觀察。在建立三維景物模型后,可利用OpenGL描述如何觀察所建立的三維模型。(3)顏色模式。OpenGL提供了RGBA模式和顏色索引兩種物體著色模式。(4)光照應(yīng)用。用OpenGL繪制的三維模型必須加上光照才能與客觀物體更加相似,物體色彩的表現(xiàn)是光照條件與物體材質(zhì)屬性相互作用的結(jié)果。(5)圖像效果增強(qiáng)。OpenGL提供了一系列的增強(qiáng)三維景觀圖像效果的函數(shù),這些函數(shù)包括反走樣、混合和霧化。(6)位圖和圖像處理。OpenGL提供了一系列專門對(duì)位圖和圖像進(jìn)行操作的函數(shù)。位圖和圖像數(shù)據(jù)均采用像素矩陣來表示。(7)紋理映射。為了更加逼真地表現(xiàn)三維景物,OpenGL提供了紋理映射功能。它所提供的一系列紋理映射函數(shù)可以十分方便地把真實(shí)圖像貼到景物的多邊形上,從而繪制逼真的三維景物。(8)實(shí)時(shí)動(dòng)畫。OpenGL采用雙緩存技術(shù)(DoubleBuffer),并為其提供了一系列的函數(shù)。(9)交互技術(shù)。OpenGL提供了方便的三維圖形人機(jī)交互接口,用戶通過輸入設(shè)備可選擇和修改三維景觀中的物體。3.5.3OpenGL開發(fā)庫的基本組成Windows下的OpenGL由如下三部分文件組成:(1)函數(shù)的說明文件:gl.h、glu.h、glut.h、glaux.h。(2)靜態(tài)鏈接庫文件:glu32.lib、glut32.lib、glaux.lib和opengl32.lib。(3)動(dòng)態(tài)鏈接庫文件:Glu.dll、glu32.dll、glut.dll、glut32.dll和opengl32.dll。OpenGL的庫函數(shù)采用C語言風(fēng)格,它們
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五保供養(yǎng)培訓(xùn)課件
- 2026年劇本殺運(yùn)營公司行業(yè)規(guī)范遵守管理制度
- 幼兒園開展戶外游戲活動(dòng)促進(jìn)兒童社交能力發(fā)展課題報(bào)告教學(xué)研究課題報(bào)告
- 2026年無人駕駛汽車安全報(bào)告
- 2025年社區(qū)養(yǎng)老服務(wù)培訓(xùn)基地建設(shè)與養(yǎng)老行業(yè)人才培養(yǎng)機(jī)制可行性研究報(bào)告
- 2026年醫(yī)療物聯(lián)網(wǎng)技術(shù)應(yīng)用報(bào)告
- 普通高中課程方案和課程標(biāo)準(zhǔn)變化的時(shí)代價(jià)值與教師應(yīng)對(duì)
- 眼巢護(hù)理基礎(chǔ)理論培訓(xùn)
- 2026及未來5年中國智能化工程行業(yè)市場(chǎng)動(dòng)態(tài)分析及發(fā)展趨向研判報(bào)告
- 2025年韓國金融科技監(jiān)管政策變化分析報(bào)告
- 供貨方案及保證措施
- 高速公路交叉口交通組織方案
- 數(shù)學(xué)廣角:搭配問題 課件 人教版數(shù)學(xué)三年級(jí)上冊(cè)
- 2025杭州市市級(jí)機(jī)關(guān)事業(yè)單位編外招聘考試備考試題及答案解析
- 車間電纜整改方案模板(3篇)
- 徐州村務(wù)管理辦法
- 政協(xié)機(jī)車輛管理辦法
- 食品加工助劑管理辦法
- 渝22TS02 市政排水管道附屬設(shè)施標(biāo)準(zhǔn)圖集 DJBT50-159
- 非現(xiàn)場(chǎng)執(zhí)法培訓(xùn)課件
- 中國電氣裝備資產(chǎn)管理有限公司招聘筆試題庫2025
評(píng)論
0/150
提交評(píng)論