版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Visual C+圖形程序設(shè)計基礎(chǔ)圖形程序設(shè)計基礎(chǔ) 內(nèi)容提要內(nèi)容提要lVisual C+是在是在Microsoft C的基礎(chǔ)上發(fā)展而來的,的基礎(chǔ)上發(fā)展而來的,隨著計算機軟、硬件技術(shù)的快速發(fā)展,如今隨著計算機軟、硬件技術(shù)的快速發(fā)展,如今Visual C+已成為集編輯、編譯、運行、調(diào)試于一體功能強已成為集編輯、編譯、運行、調(diào)試于一體功能強大的集成編程環(huán)境。本章以大的集成編程環(huán)境。本章以Visual C+ 6.0為對象,為對象,主要介紹主要介紹Visual C+集成編成環(huán)境的使用、圖形設(shè)備集成編成環(huán)境的使用、圖形設(shè)備接口和常用圖形程序設(shè)計接口和常用圖形程序設(shè)計,目的是通過對目的是通過對Visual
2、C+的的學(xué)習(xí),掌握學(xué)習(xí),掌握Visual C+圖形程序設(shè)計的方法,為計算圖形程序設(shè)計的方法,為計算機圖形學(xué)原理部分的算法實現(xiàn)提供程序工具和方法。機圖形學(xué)原理部分的算法實現(xiàn)提供程序工具和方法。 2.1 Visual C+ 6.0應(yīng)用程序開發(fā)方法應(yīng)用程序開發(fā)方法l介紹介紹Visual C+ 6.0集成開發(fā)環(huán)境,以一個簡集成開發(fā)環(huán)境,以一個簡單的實例介紹利用單的實例介紹利用Visual C+應(yīng)用程序工程應(yīng)用程序工程建立方法和程序設(shè)計框架。建立方法和程序設(shè)計框架。 2.1.1 Visual C+的集成開發(fā)環(huán)境的集成開發(fā)環(huán)境l從開始菜單中啟動從開始菜單中啟動Visual C+ 6.0,進入開發(fā),進入開發(fā)
3、集成環(huán)境。打開一個項目后,可以看到集成環(huán)境。打開一個項目后,可以看到Visual C+ 6.0的開發(fā)環(huán)境由標(biāo)題欄、工具欄、工作的開發(fā)環(huán)境由標(biāo)題欄、工具欄、工作區(qū)窗口、源代碼編輯窗口、輸出窗口和狀態(tài)欄區(qū)窗口、源代碼編輯窗口、輸出窗口和狀態(tài)欄組成,見圖組成,見圖2.1所示。所示。 圖圖2.1 Visual C+ 6.0集成開發(fā)環(huán)境集成開發(fā)環(huán)境 標(biāo)題欄菜單欄工作區(qū)源代碼編輯窗口 狀態(tài)欄 標(biāo)題欄用于顯示應(yīng)用程序名和所打開的文件名,標(biāo)題標(biāo)題欄用于顯示應(yīng)用程序名和所打開的文件名,標(biāo)題欄的顏色可以表明對應(yīng)窗口是否被激活。菜單欄包括欄的顏色可以表明對應(yīng)窗口是否被激活。菜單欄包括文件、編輯、顯示、插入、工程、編
4、譯、工具、窗口文件、編輯、顯示、插入、工程、編譯、工具、窗口和幫助九項主菜單,包含了從源代碼的編輯、界面設(shè)和幫助九項主菜單,包含了從源代碼的編輯、界面設(shè)計、程序調(diào)試和編譯運行在內(nèi)的所有功能。工具欄列計、程序調(diào)試和編譯運行在內(nèi)的所有功能。工具欄列出了常用的菜單命令功能和對象方法。工具欄的下面出了常用的菜單命令功能和對象方法。工具欄的下面是兩個窗口,一個是工作區(qū)窗口,用于列出工程中的是兩個窗口,一個是工作區(qū)窗口,用于列出工程中的各種對象,一個是源代碼編輯窗口,用于各個對象的各種對象,一個是源代碼編輯窗口,用于各個對象的程序設(shè)計。輸出窗口顯示項目建立過程中所產(chǎn)生的各程序設(shè)計。輸出窗口顯示項目建立過程
5、中所產(chǎn)生的各種信息。屏幕底端是狀態(tài)欄,它給出當(dāng)前操作或所選種信息。屏幕底端是狀態(tài)欄,它給出當(dāng)前操作或所選擇命令的提示信息。擇命令的提示信息。2.1.2 應(yīng)用程序工程的建立方法應(yīng)用程序工程的建立方法 lVisual C+提供了一種稱為提供了一種稱為App Wizard的工具,利用的工具,利用該工具,用戶可以方便地按照自己的需要創(chuàng)建符合需該工具,用戶可以方便地按照自己的需要創(chuàng)建符合需要的應(yīng)用程序框架。在這個基礎(chǔ)上,用戶可以進一步要的應(yīng)用程序框架。在這個基礎(chǔ)上,用戶可以進一步將自己編寫的程序加入到這個框架中,實現(xiàn)用戶程序?qū)⒆约壕帉懙某绦蚣尤氲竭@個框架中,實現(xiàn)用戶程序的功能。下面介紹建立的功能。下面介
6、紹建立VcApp應(yīng)用程序框架的方法,應(yīng)用程序框架的方法,其它應(yīng)用程序的方法都與此類似。其它應(yīng)用程序的方法都與此類似。l第一步:啟動第一步:啟動Visual C+,選擇工程方法選擇工程方法l 從開始菜單中選擇從開始菜單中選擇 Visual C+,進入,進入Visual C+集集成環(huán)境。從文件菜單中選擇新建成環(huán)境。從文件菜單中選擇新建(New)命令,命令,2.1.2 應(yīng)用程序工程的建立方法應(yīng)用程序工程的建立方法 l彈出圖彈出圖2-2對話框。切換到工程(對話框。切換到工程(Projects)標(biāo))標(biāo)簽,項目類型選擇簽,項目類型選擇MFC AppWizard(exe),輸,輸入工程的名字(如入工程的名字
7、(如VcApp),選擇項目放置的),選擇項目放置的位置,然后單擊位置,然后單擊“確定確定”按鈕。按鈕。圖圖2-2 Visual C+的的New對話框?qū)υ捒?2.1.2 2.1.2 應(yīng)用程序工程的建立方法應(yīng)用程序工程的建立方法 l第二步:設(shè)置應(yīng)用程序的特性。第二步:設(shè)置應(yīng)用程序的特性。l這些設(shè)置包括六個問題,每一個問題都有不同的選項這些設(shè)置包括六個問題,每一個問題都有不同的選項供選擇。一個問題選擇完后,通過供選擇。一個問題選擇完后,通過“下一步下一步”(Next)選擇下一個問題,直到六個問題選擇完畢。還可以通選擇下一個問題,直到六個問題選擇完畢。還可以通過過“上一步上一步”(Back)返回上一個
8、問題重新選擇。下面返回上一個問題重新選擇。下面繼續(xù)上面的例子,在單擊繼續(xù)上面的例子,在單擊“確定確定”按鈕后,彈出第一按鈕后,彈出第一個問題窗口,如圖個問題窗口,如圖2-3所示。所示。l第一個問題是建立什么類型的應(yīng)用程序,有三個選項:第一個問題是建立什么類型的應(yīng)用程序,有三個選項:單個文檔單個文檔( (Single document) )、多重文檔、多重文檔( (Multiple document) )和基本對話和基本對話( (Dialog based) )。2.1.22.1.2 應(yīng)用程序工程的建立方法應(yīng)用程序工程的建立方法 l單個文檔應(yīng)用程序主窗口中只有一個窗口,多重文檔可以單個文檔應(yīng)用程序
9、主窗口中只有一個窗口,多重文檔可以在主窗口中開多個子窗口,基本對話主窗口是一個對話框。在主窗口中開多個子窗口,基本對話主窗口是一個對話框。例中選擇單個文檔,單擊例中選擇單個文檔,單擊“確定確定”,進入下一個問題,如,進入下一個問題,如圖圖2-4所示。所示。l第二個問題是數(shù)據(jù)庫的支持,是否用第二個問題是數(shù)據(jù)庫的支持,是否用ODBC存取數(shù)據(jù)庫,存取數(shù)據(jù)庫,有四個選項:不包括數(shù)據(jù)庫的支持(有四個選項:不包括數(shù)據(jù)庫的支持(None)、僅包含)、僅包含ODBC頭文件(頭文件(Header files only)、指定一個數(shù)據(jù)庫但沒)、指定一個數(shù)據(jù)庫但沒有文件支持和指定一個數(shù)據(jù)庫但需要文件支持。當(dāng)選擇了有
10、文件支持和指定一個數(shù)據(jù)庫但需要文件支持。當(dāng)選擇了后兩項,則需要用戶選擇一個已經(jīng)建立的數(shù)據(jù)庫。例中不后兩項,則需要用戶選擇一個已經(jīng)建立的數(shù)據(jù)庫。例中不需要數(shù)據(jù)庫支持,選擇第一個選項需要數(shù)據(jù)庫支持,選擇第一個選項“否否”,進入第三個問,進入第三個問題,如圖題,如圖2-5所示所示 圖圖2-3 第一個問題:選擇應(yīng)用程序的類型第一個問題:選擇應(yīng)用程序的類型 圖圖2-4 第二個問題:選擇是否要用第二個問題:選擇是否要用ODBC支持支持 l第三個問題是對第三個問題是對ActiveX的支持。有五個選項:的支持。有五個選項:(1)沒有對)沒有對ActiveX的支持;的支持;(2)ActiveX容器容器, ,它可
11、以包含鏈接和嵌入對象。容器不能它可以包含鏈接和嵌入對象。容器不能為其它的為其它的ActiveX程序提供支持程序提供支持, ,它只能維護嵌入對象;它只能維護嵌入對象;(3)微型服務(wù)器()微型服務(wù)器(Mini-server),應(yīng)用程序不能獨立運行,),應(yīng)用程序不能獨立運行,只能被調(diào)用為其它程序建立只能被調(diào)用為其它程序建立ActiveX對象。對象。(4)完整服務(wù)器()完整服務(wù)器(Full-server),它能夠獨立運行,并能),它能夠獨立運行,并能夠為其它應(yīng)用程序建立夠為其它應(yīng)用程序建立ActiveX對象。對象。(5)容器和服務(wù)器,一個應(yīng)用程序可以同時是容器和服務(wù))容器和服務(wù)器,一個應(yīng)用程序可以同時
12、是容器和服務(wù)器。器。l在例子中,選擇第一個選項,沒有對在例子中,選擇第一個選項,沒有對ActiveX的支持,單的支持,單擊擊“下一個下一個”(Next)進入下一個問題。)進入下一個問題。 圖圖2-5 第三個問題:選擇是否對第三個問題:選擇是否對ActiveX的支持的支持 第四個問題是應(yīng)用程序的特性和高級選項,如下圖第四個問題是應(yīng)用程序的特性和高級選項,如下圖 圖2-6 應(yīng)用程序的特性和高級選項 例中全部采用默認選項,進入下一個問題。例中全部采用默認選項,進入下一個問題。第五個問題是項目的風(fēng)格、原文件注釋和第五個問題是項目的風(fēng)格、原文件注釋和MFC庫類型,如庫類型,如圖圖2-7所示。所示。在例子
13、中全部采用默認選項,進入第六個問題。在例子中全部采用默認選項,進入第六個問題。第六個問題是確定類名和文件名,如圖第六個問題是確定類名和文件名,如圖2-8所示。所示。 基于第一個問題到第五個問題的回答,基于第一個問題到第五個問題的回答,AppWizard會把會把將要建立的新類的名稱通知用戶。將要建立的新類的名稱通知用戶。AppWizard將為應(yīng)用將為應(yīng)用程序建立四個新類,程序建立四個新類,CVcAppApp是應(yīng)用程序類,它是是應(yīng)用程序類,它是CWinApp的派生類。的派生類。CMainFrame是一個擁有應(yīng)用程序是一個擁有應(yīng)用程序主窗口的類。主窗口的類。CVcAppDoc和和CVcAppView
14、是該應(yīng)用程序是該應(yīng)用程序的文檔和視圖類。這些名字用戶可以改變。最后單擊的文檔和視圖類。這些名字用戶可以改變。最后單擊“完成完成”(Finish),顯示所建項目的信息,單擊顯示所建項目的信息,單擊“確定確定”后,項目建立完成。后,項目建立完成。 圖圖2-7 項目的風(fēng)格、原文件注釋和項目的風(fēng)格、原文件注釋和MFC庫類型庫類型 圖2-8 通知MFC產(chǎn)生的類名稱 2.1.3 2.1.3 輸入源程序進行程序設(shè)計輸入源程序進行程序設(shè)計 l應(yīng)用程序項目工程建立以后,就為應(yīng)用程序的開發(fā)建立了應(yīng)用程序項目工程建立以后,就為應(yīng)用程序的開發(fā)建立了一個框架,這時不輸入任何程序代碼,對該項目程序進行一個框架,這時不輸入
15、任何程序代碼,對該項目程序進行編譯和運行,可以生成一個完整的窗口程序。用戶根據(jù)項編譯和運行,可以生成一個完整的窗口程序。用戶根據(jù)項目工程中的不同類,輸入自己設(shè)計的程序代碼,完成用戶目工程中的不同類,輸入自己設(shè)計的程序代碼,完成用戶的程序設(shè)計。的程序設(shè)計。l例如,從例如,從VcApp Classes中找到中找到CVcAppView的的OnDraw()()函數(shù),如圖函數(shù),如圖2-9所示。雙擊所示。雙擊OnDraw()()函數(shù),這時系統(tǒng)會打函數(shù),這時系統(tǒng)會打開開VcAppView.cpp文件,而且光標(biāo)正置于文件,而且光標(biāo)正置于OnDraw()()函數(shù)函數(shù)中,在其中輸入下列語句:中,在其中輸入下列語句
16、:lpDC-TextOut(30,30,”同學(xué)們好,歡迎使用同學(xué)們好,歡迎使用VC+編編程!程!”);l編譯并運行該程序,運行結(jié)果如圖編譯并運行該程序,運行結(jié)果如圖2-10所示。所示。圖2-9 輸入程序源代碼 圖2-10 運行結(jié)果 2. .2 圖形設(shè)備接口和圖形程序設(shè)計圖形設(shè)備接口和圖形程序設(shè)計 2.2.1 圖形設(shè)備接口簡介圖形設(shè)備接口簡介 l在在Windows系統(tǒng)中,程序都是通過一個叫做系統(tǒng)中,程序都是通過一個叫做圖形圖形設(shè)備接口設(shè)備接口(GDI, Graphics Device Interface)的抽象接口的抽象接口和硬件打交道,和硬件打交道,Windows會自動將設(shè)備環(huán)境表映會自動將設(shè)
17、備環(huán)境表映射到相應(yīng)的物理設(shè)備,并且會提供正確的輸入射到相應(yīng)的物理設(shè)備,并且會提供正確的輸入/輸輸出指令。出指令。lGDI是是Windows系統(tǒng)核心的三種動態(tài)鏈接庫之一,系統(tǒng)核心的三種動態(tài)鏈接庫之一,它管理它管理Windows系統(tǒng)的所有程序的圖形輸出。在系統(tǒng)的所有程序的圖形輸出。在Windows系統(tǒng)中,系統(tǒng)中,GDI向程序員提供了高層次的向程序員提供了高層次的繪圖函數(shù),只要掌握這些繪圖函數(shù),就可以很方繪圖函數(shù),只要掌握這些繪圖函數(shù),就可以很方便地進行圖形程序設(shè)計。便地進行圖形程序設(shè)計。 lDC是一個數(shù)據(jù)結(jié)構(gòu),當(dāng)程序向是一個數(shù)據(jù)結(jié)構(gòu),當(dāng)程序向GDI設(shè)備中繪圖時,設(shè)備中繪圖時,需要訪問該設(shè)備的需要訪
18、問該設(shè)備的DC。MFC將將GDI的的DC封裝在封裝在C+類中,包括類中,包括CDC類和類和CDC派生類,這些類中的許多派生類,這些類中的許多成員都是對本地成員都是對本地GDI繪圖函數(shù)進行簡單封裝而形成的繪圖函數(shù)進行簡單封裝而形成的內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)。lDC的作用的作用就是提供程序與物理設(shè)備或者虛擬設(shè)備之就是提供程序與物理設(shè)備或者虛擬設(shè)備之間的聯(lián)系,除此之外,間的聯(lián)系,除此之外,DC還要處理繪圖屬性的設(shè)置,還要處理繪圖屬性的設(shè)置,如文本的顏色等。程序員可以通過調(diào)用專門的如文本的顏色等。程序員可以通過調(diào)用專門的GDI函函數(shù)修改繪圖屬性,如數(shù)修改繪圖屬性,如SetTextColor()函數(shù)。函數(shù)。l
19、CDC類是類是GDI封裝在封裝在MFC中最大的一個類中最大的一個類,它表示,它表示總的總的DC。表。表2.1列出了列出了CDC中的一些常用繪圖函數(shù)。中的一些常用繪圖函數(shù)。設(shè)備描述表設(shè)備描述表(DC, Device Context)表表2.1 CDC類中常用繪圖函數(shù)類中常用繪圖函數(shù) 函函 數(shù)數(shù)描描 述述使用頻率使用頻率Arc()橢圓弧橢圓弧*BitBlt()把位圖從一個把位圖從一個DC拷貝到另一個拷貝到另一個DC*Draw3dRect()繪制三維矩形繪制三維矩形*DrawDragRect()繪制用鼠標(biāo)拖動的矩形繪制用鼠標(biāo)拖動的矩形*DrawEdge()繪制矩形的邊緣繪制矩形的邊緣*DrawIco
20、n()繪制圖標(biāo)繪制圖標(biāo)*Ellipse()繪制橢圓繪制橢圓*FillRect()繪制用給定的畫刷顏色填充矩形繪制用給定的畫刷顏色填充矩形*FillRgn()繪制用給定的畫刷顏色填充區(qū)域繪制用給定的畫刷顏色填充區(qū)域*FillSolidRed()繪制用給定的顏色填充矩形繪制用給定的顏色填充矩形*FloodFill()用當(dāng)前的畫刷顏色填充區(qū)域用當(dāng)前的畫刷顏色填充區(qū)域*FrameRect()繪制矩形邊界繪制矩形邊界*FrameRgn()繪制區(qū)域邊界繪制區(qū)域邊界*GetBKColor()獲取背景顏色獲取背景顏色*GetCurrentBitmap()獲取所選位圖的指針獲取所選位圖的指針*GetCurren
21、tBrush()獲取所選畫刷的指針獲取所選畫刷的指針*GetCurrentFont()獲取所選字體的指針獲取所選字體的指針*GetCurrentPalette()獲取所選調(diào)色板的指針獲取所選調(diào)色板的指針*GetCurrentPen()獲取所選畫筆的指針獲取所選畫筆的指針*GetCurrentPosition()獲取畫筆的當(dāng)前位置獲取畫筆的當(dāng)前位置*GetDeviceCaps()獲取顯示設(shè)備能力的信息獲取顯示設(shè)備能力的信息*GetMapMode()獲取當(dāng)前設(shè)置映射模式獲取當(dāng)前設(shè)置映射模式*Getpixel()獲取給定像素的獲取給定像素的RGB顏色值顏色值*GetPolyFillMode()獲取多
22、邊形填充模式獲取多邊形填充模式*GetTextColor()獲取文本顏色獲取文本顏色*GetTextExtent()獲取文本的寬度和高度獲取文本的寬度和高度*GetTextMetrics()獲取當(dāng)前文本的信息獲取當(dāng)前文本的信息*GetWindow()獲取獲取DC窗口的指針窗口的指針*GrayString()繪制灰色文本繪制灰色文本*LineTo()繪制直線繪制直線*MoveTo()設(shè)置當(dāng)前畫筆位置設(shè)置當(dāng)前畫筆位置*Pie()繪制餅圖繪制餅圖*Polygon()繪制多邊形繪制多邊形*PolyLine()繪制一組直線繪制一組直線*RealizePalette()將邏輯調(diào)色板映射到系統(tǒng)調(diào)色板將邏輯調(diào)
23、色板映射到系統(tǒng)調(diào)色板*Rectangle()繪制矩形繪制矩形*RoundRect()繪制圓角矩形繪制圓角矩形*SelectObject()選擇選擇GDI繪圖對象繪圖對象*SelectPalette()選擇邏輯調(diào)色板選擇邏輯調(diào)色板*SelectStockObject()選擇預(yù)定義圖形對象選擇預(yù)定義圖形對象*l這些函數(shù)的語法和使用可以通過這些函數(shù)的語法和使用可以通過MSDN幫助查詢。幫助查詢。2.2.2節(jié)節(jié)主要介紹主要介紹Windows中基本圖形,包括點、直線、圓、圓中基本圖形,包括點、直線、圓、圓弧、矩形、橢圓、扇形、折線等程序設(shè)計弧、矩形、橢圓、扇形、折線等程序設(shè)計 SetBkColor()設(shè)
24、置背景顏色設(shè)置背景顏色*SetMapMode()設(shè)置映射模式設(shè)置映射模式*SetPixel()把像素設(shè)定為給定的顏色把像素設(shè)定為給定的顏色*SetTextColor()設(shè)置文本顏色設(shè)置文本顏色*StretchBlt()把位圖從一個把位圖從一個DC拷貝到另一個拷貝到另一個DC, ,并根據(jù)需要擴展或壓縮位圖并根據(jù)需要擴展或壓縮位圖*TextOut()繪制字符串文本繪制字符串文本*2.2.2 2.2.2 繪制基本圖形繪制基本圖形 (1)畫點)畫點 SetPixel()函數(shù)可以在指定的坐標(biāo)位置按指定函數(shù)可以在指定的坐標(biāo)位置按指定的顏色畫點。函數(shù)原型說明如下:的顏色畫點。函數(shù)原型說明如下: COLORR
25、EF CDC: SetPixel(int X, int Y, COLORREF crColor);l其中其中(X,Y)(X,Y)為點的坐標(biāo)位置,為點的坐標(biāo)位置,crColor參數(shù)為點的參數(shù)為點的顏色值。如果函數(shù)調(diào)用成功,則函數(shù)返回像素的顏色值。如果函數(shù)調(diào)用成功,則函數(shù)返回像素的顏色值,否則返回值為顏色值,否則返回值為-1。l顏色值通過顏色值通過RGB(Red,Green,Blue)來設(shè)置,其中來設(shè)置,其中三個參數(shù)取值三個參數(shù)取值0255。例如,在。例如,在VcAPP項目中,項目中,在在CVcAppView類中的類中的OnDraw()函數(shù)中加入下列函數(shù)中加入下列畫點語句:畫點語句:/繪制一組彩色
26、點繪制一組彩色點 pDC-TextOut(20,20,point:);pDC-SetPixel(100,20,RGB(255,0,0); pDC-SetPixel(110,20,RGB(0,255,0);pDC-SetPixel(120,20,RGB(0,0,255);pDC-SetPixel(100,20,RGB(255,255,0);pDC-SetPixel(100,20,RGB(255,0,255);pDC-SetPixel(100,20,RGB(0,255,255);pDC-SetPixel(100,20,RGB(0,0,0);pDC-SetPixel(100,20,RGB(255,2
27、55,255);運行程序,查看運行結(jié)果。運行程序,查看運行結(jié)果。 (2)畫直線和折線)畫直線和折線 l畫直線需要畫直線需要LineTo()和和MoveTo()兩個函數(shù)的配合使用。兩個函數(shù)的配合使用。lLineTo()函數(shù)以當(dāng)前位置所在的點為直線的起點,另指函數(shù)以當(dāng)前位置所在的點為直線的起點,另指定一個點為直線的終點,畫出一段直線。直線的顏色通定一個點為直線的終點,畫出一段直線。直線的顏色通過畫筆的顏色來設(shè)定,在后面介紹。過畫筆的顏色來設(shè)定,在后面介紹。LineTo()函數(shù)原型函數(shù)原型說明如下:說明如下:BOOL CDC: LineTo(int nXEnd, int nYEnd);l直線的終點位
28、置由(直線的終點位置由(nXEnd, nYEnd)指定。如果函)指定。如果函數(shù)調(diào)用成功,那么該點就成為當(dāng)前位置,并返回數(shù)調(diào)用成功,那么該點就成為當(dāng)前位置,并返回TRUE,否則返回否則返回FALSE。lMoveTo()函數(shù)只是將當(dāng)前位置移動到指定位置,函數(shù)只是將當(dāng)前位置移動到指定位置,它并沒有畫出直線,其函數(shù)說明為:它并沒有畫出直線,其函數(shù)說明為: BOOL CDC: MoveTo (int X, int Y);示例:示例:在在CVcAppView類中的類中的OnDraw()函數(shù)中加函數(shù)中加入下列畫點語句:入下列畫點語句:/繪制直線繪制直線 pDC-TextOut(20,60,Line:); p
29、DC-MoveTo(20,90); pDC-LineTo(160,90);Polyline()函數(shù)用來畫一條折線,而函數(shù)用來畫一條折線,而PolyPolyline()函數(shù)則用來畫多條折線,其函數(shù)原型說明如下:函數(shù)則用來畫多條折線,其函數(shù)原型說明如下:BOOL CDC:Polyline(COUST POINT *lppt, int cPoints);BOOL CDC:PolyPolyline(COUST POINT * lppt, COUST DWORD *lpdwPolyPoints, DWORD cCount);在在Polyline()函數(shù)中,函數(shù)中,lppt是指向折線頂點數(shù)組的是指向折線頂
30、點數(shù)組的指針,而指針,而cPoints是折線頂點數(shù)組中的頂點數(shù)。是折線頂點數(shù)組中的頂點數(shù)。例如,例如,繪制一條具有繪制一條具有4個頂點的折線,程序如下:個頂點的折線,程序如下:POINT polylinepoint4=70,240,20,190, 70,190,20,240;pDC-Polyline(polylinepoint,4);在在PolyPolyline()()函數(shù)中,函數(shù)中,lppt是指向保存頂是指向保存頂點數(shù)組的指針,而各條折線的頂點數(shù)則保存在點數(shù)組的指針,而各條折線的頂點數(shù)則保存在lpdwPolyPoints參數(shù)所指向的數(shù)組中,最后的參數(shù)所指向的數(shù)組中,最后的cCount參數(shù)指定
31、折線的數(shù)目。參數(shù)指定折線的數(shù)目。例如:例如:POINT polypolylinePt9=95,160,120,185,120,250, 145,160,120,185,90,185,150,185,80,210,160,210;DWORD dwPolyPoints4=3,2,2,2; /分四段折線,分別占分四段折線,分別占用用3,2, ,2, ,2個頂點個頂點 pDC-PolyPolyline(polypolylinePt, dwPolyPoints, 4);注:由于一條折線至少需要注:由于一條折線至少需要2個頂點,因此個頂點,因此dwPolyPoints數(shù)數(shù)組中的數(shù)不應(yīng)該小于組中的數(shù)不應(yīng)該小
32、于2。(3)畫弧線和曲線)畫弧線和曲線 通過通過Arc()函數(shù)畫弧線或整個橢圓。橢圓限定在一函數(shù)畫弧線或整個橢圓。橢圓限定在一個矩形內(nèi),稱為外接矩形。個矩形內(nèi),稱為外接矩形。Arc()函數(shù)的圓形說明函數(shù)的圓形說明如下:如下: BOOL CDC: Arc(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc); l其中其中(nLeftRect, nTopRect)是外接矩形的左上角是外接矩形的左上角坐標(biāo)值,坐標(biāo)
33、值,(nRightRect, nBottomRect)是外接矩形是外接矩形的右下角坐標(biāo)值。而橢圓中心與點的右下角坐標(biāo)值。而橢圓中心與點(nXStartArc, nYStartArc)所構(gòu)成的射線與橢圓的交點成為弧線所構(gòu)成的射線與橢圓的交點成為弧線的起點,橢圓中心與點的起點,橢圓中心與點(nXEndArc, nYEndArc)所所構(gòu)成的射線與橢圓的交點成為弧線的終點。橢圓構(gòu)成的射線與橢圓的交點成為弧線的終點。橢圓上從始點到終點就形成一條弧線。上從始點到終點就形成一條弧線。l 在在Windows系統(tǒng)中,弧線從始點到終點的方向是系統(tǒng)中,弧線從始點到終點的方向是逆時針方向,但可以通過逆時針方向,但可以
34、通過SetArcDirection()函數(shù)函數(shù)將繪制弧線方向設(shè)置為順時針方向。將繪制弧線方向設(shè)置為順時針方向。 for (i=0;iArc(260-5*i,70-5*i,260+5*i,70+5*i,260+5*i,70,260+5*i,70);for (i=3;iArc(260-10*i, 70-10*i, 260+10*i, 70+10*i, (int)260+10*i*cos(60*3.1415926/180), (int)70+10*i*sin(60*3.1415926/180), (int)260+10*i*cos(60*3.1415926/180), (int)70-10*i*si
35、n(60*3.1415926/180);pDC-Arc(260-10*i, 70-10*i, 260+10*i, 70+10*i, (int)260-10*i*cos(60*3.1415926/180), (int)70-10*i*sin(60*3.1415926/180), (int)260-10*i*cos(60*3.1415926/180), (int)70+10*i*sin(60*3.1415926/180);示例,用示例,用Arc()繪制圓、圓弧和橢圓,程序如下:繪制圓、圓弧和橢圓,程序如下:lBezier曲線是最常見的非規(guī)則曲線之一。曲線是最常見的非規(guī)則曲線之一。Bezier曲曲線
36、屬于三次曲線,需要四個控制頂點來確定一條線屬于三次曲線,需要四個控制頂點來確定一條Bezier曲線,其中曲線通過第一點和最后一點,曲線,其中曲線通過第一點和最后一點,并且第一條邊和最后一條邊是曲線在起點和終點并且第一條邊和最后一條邊是曲線在起點和終點處的切線,從而確定了曲線的走向。處的切線,從而確定了曲線的走向。PolyBezier()函數(shù)可以畫出一條或多條函數(shù)可以畫出一條或多條Bezier曲線,其函數(shù)原曲線,其函數(shù)原型說明如下:型說明如下: lBOOL CDC: PolyBezier(CONST POINT * lppt, DWORD cPoints); Bezier曲線其中,其中,lppt
37、參數(shù)是曲線控制頂點所組成的數(shù)組,參數(shù)是曲線控制頂點所組成的數(shù)組,cPoints參數(shù)表示參數(shù)表示lppt數(shù)組中的頂點數(shù),一條數(shù)組中的頂點數(shù),一條Bezier曲線需曲線需要四個控制頂點。如果要四個控制頂點。如果lppt數(shù)組用于畫多條數(shù)組用于畫多條Bezier曲線,曲線,第二條以后的曲線只需要三個控制頂點,因為后面的曲第二條以后的曲線只需要三個控制頂點,因為后面的曲線總是把前一條曲線的終點作為自己的起點。線總是把前一條曲線的終點作為自己的起點。示例,示例,給出四個控制頂點,畫出一條給出四個控制頂點,畫出一條Bezier曲線和特曲線和特征多邊形。征多邊形。/繪制繪制Bezier 曲線曲線POINT p
38、olyBezier4=20,310,60,240,120,300,160,330;pDC-Polyline(polyBezier,4);pDC-PolyBezier(polyBezier,4); (4)畫封閉曲線)畫封閉曲線 Windows中提供了一組畫封閉曲線的函數(shù),包中提供了一組畫封閉曲線的函數(shù),包括繪制矩形、多邊形、橢圓等,這些畫封閉曲線的括繪制矩形、多邊形、橢圓等,這些畫封閉曲線的函數(shù)不但可以利用畫筆來畫出輪廓線,同時還可以函數(shù)不但可以利用畫筆來畫出輪廓線,同時還可以利用畫刷來填充這些封閉曲線所圍成的區(qū)域。利用畫刷來填充這些封閉曲線所圍成的區(qū)域。 Rectangle()函數(shù)用來畫矩形,
39、其函數(shù)原型說明如下:函數(shù)用來畫矩形,其函數(shù)原型說明如下: BOOL CDC: Rectangle(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); l其中,參數(shù)其中,參數(shù)nLeftRect和和 nTopRect給出了矩形左給出了矩形左上角的坐標(biāo),而上角的坐標(biāo),而nRightRect和和 nBottomRect則給則給出矩形的右下角坐標(biāo)。出矩形的右下角坐標(biāo)。lEllipse()函數(shù)的作用則是畫橢圓形。在函數(shù)的作用則是畫橢圓形。在Ellipse()函函數(shù)中,橢圓是由其外接矩形來確定的,外接矩形數(shù)中,橢圓是由其外接矩形來確定
40、的,外接矩形的中心與橢圓中心重合,矩形的長與寬和橢圓的的中心與橢圓中心重合,矩形的長與寬和橢圓的長短軸相等。函數(shù)說明如下:長短軸相等。函數(shù)說明如下: BOOL CDC: Ellipse(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); 其中的參數(shù)說明與其中的參數(shù)說明與Rectangle()函數(shù)相同。函數(shù)相同。 RoundRect()函數(shù)用來畫圓角矩形,其函數(shù)的原型函數(shù)用來畫圓角矩形,其函數(shù)的原型說明如下:說明如下: BOOL CDC: RoundRect(int nLeftRect, int nTopRect, int
41、 nRightRect, int nBottomRect,int nWidth, int nHeight); 其中的前四個參數(shù)與其中的前四個參數(shù)與Rectangle()函數(shù)相同,函數(shù)相同,nWidth表示圓角的寬度表示圓角的寬度, nHeight表示圓角的高度。表示圓角的高度。 Polygon()函數(shù)用來畫封閉的任意多邊形,其函數(shù)原函數(shù)用來畫封閉的任意多邊形,其函數(shù)原型說明如下:型說明如下: BOOL CDC: Polygon(COUST POINT *lpPoints, int cCount); 其中的參數(shù)說明與其中的參數(shù)說明與Polyline()函數(shù)相同。但兩個函數(shù)相同。但兩個函數(shù)有區(qū)別,
42、函數(shù)有區(qū)別,Polygon()函數(shù)會自動將起點和終點相函數(shù)會自動將起點和終點相連形成封閉的多邊形,而連形成封閉的多邊形,而Polyline()函數(shù)則畫出多條函數(shù)則畫出多條折線,只有當(dāng)最后一點與起點相同時才畫出封閉的折線,只有當(dāng)最后一點與起點相同時才畫出封閉的多邊形。多邊形。 示例,示例,繪制矩形、圓角矩形、橢圓和多邊形,繪制矩形、圓角矩形、橢圓和多邊形,程序如下:程序如下:/繪制矩形、圓角矩形、橢圓和多邊形繪制矩形、圓角矩形、橢圓和多邊形pDC-Rectangle(190,270,250,310);pDC-RoundRect(265,270,330,310,30,20);pDC-Ellipse
43、(260-50,200-30,260+50,200+30);POINT polygonPts3=390,160,430,220,350,210;pDC-Polygon(polygonPts,3); 2.2.3 畫筆與畫刷畫筆與畫刷 (1)畫筆)畫筆 當(dāng)繪制圖形時,線條的屬性,包括顏色、當(dāng)繪制圖形時,線條的屬性,包括顏色、寬度、樣式等都是由畫筆來確定的。程序員可寬度、樣式等都是由畫筆來確定的。程序員可以創(chuàng)建畫筆,定義畫筆的屬性,從而畫出多彩以創(chuàng)建畫筆,定義畫筆的屬性,從而畫出多彩的圖形。的圖形。方法一:方法一:直接構(gòu)造一個直接構(gòu)造一個CPen對象,并將定義畫筆對象,并將定義畫筆的參數(shù)傳給它,的參
44、數(shù)傳給它,例如:例如: CPen pen(PS-SOLID,1,RGB(255,0,0); 創(chuàng)建一個寬度為一個像素、實線和紅色的畫筆。創(chuàng)建一個寬度為一個像素、實線和紅色的畫筆。 方法二:方法二:首先聲明一個沒有初始化的首先聲明一個沒有初始化的CPen類對象,然類對象,然后再用后再用CreatePen()函數(shù)定義畫筆的屬性。例如,函數(shù)定義畫筆的屬性。例如, CPen Pen; Pen-CreatePen (PS-SOLID,1,RGB(255,0,0);方法三:方法三:先聲明一個先聲明一個CPen類對象和一個描述畫筆結(jié)構(gòu)類對象和一個描述畫筆結(jié)構(gòu)的的LOGPEN類對象,并填入畫筆的屬性值,然后調(diào)類
45、對象,并填入畫筆的屬性值,然后調(diào)用用CreatePenIndirect()函數(shù)來創(chuàng)建畫筆。如下所示:函數(shù)來創(chuàng)建畫筆。如下所示:CPen Pen;LOGPEN LogPen;LogPen.lopnStyle=PS_SOLID;LogPen.lopnWidth=1;LogPen.lpenColor=RGB(255,0,0);Pen.CreatePenIndirect(&LogPen); 如果畫筆被成功創(chuàng)建,那么兩個函數(shù)返回如果畫筆被成功創(chuàng)建,那么兩個函數(shù)返回TRUE,否則返回否則返回FALSE。 畫筆包括樣式、寬度和顏色三個屬性。表畫筆包括樣式、寬度和顏色三個屬性。表2.2列出了列出了GD
46、I畫筆的樣式。畫筆的樣式。l畫筆的寬度用像素個數(shù)來確定。畫筆的寬度用像素個數(shù)來確定。PS_DASH、PS_DOT、PS_DASHDOT和和PS_DASHDOTDOT參數(shù)要求畫筆寬度參數(shù)要求畫筆寬度只能為只能為1,其它參數(shù)可以創(chuàng)建任意寬度的畫筆。,其它參數(shù)可以創(chuàng)建任意寬度的畫筆。l畫筆的顏色是一個畫筆的顏色是一個24位的位的RGB顏色,由顏色,由RGB(rColor,gColor,bColor)來定義,三個參數(shù)取值來定義,三個參數(shù)取值0255。lWindows預(yù)定義了三個實線、預(yù)定義了三個實線、1個像素寬的畫筆,它們是個像素寬的畫筆,它們是WHITE_PEN、BLACK_PEN和和NULL_PE
47、N,程序中可以,程序中可以直接使用這些畫筆,方法如下:直接使用這些畫筆,方法如下:l CPen Pen;l Pen.CreateStockObject(WHITE_PEN);l示例:示例:在屏幕上繪制三組直線,第一組按不同線型繪制,在屏幕上繪制三組直線,第一組按不同線型繪制,第二組按不同寬度繪制,第三組按不同顏色繪制。程序如第二組按不同寬度繪制,第三組按不同顏色繪制。程序如下:下: /畫筆的樣式、寬度和顏色畫筆的樣式、寬度和顏色int i1;int nPenStyle= PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PS_IN
48、SIDEFRAME,;CPen *pNewPen;CPen *pOldPen;/用不同樣式的畫筆用不同樣式的畫筆for (i1=0;i1CreatePen(nPenStylei1,1,RGB(0,0,0)pOldPen=pDC-SelectObject(pNewPen); /選擇新筆,選擇新筆,并保存舊筆并保存舊筆/畫直線畫直線pDC-MoveTo(20,60+i1*20);pDC-LineTo(160,60+i1*20);/恢復(fù)原有的筆恢復(fù)原有的筆pDC-SelectObject(pOldPen);else /出錯提示出錯提示AfxMessageBox(CreatePen Erroe!);
49、/刪除新筆刪除新筆delete pNewPen;/用不同的寬度的筆繪圖用不同的寬度的筆繪圖for(i1=0;i1CreatePen(PS_SOLID,i1+1,RGB(0,0,0)pOldPen=pDC-SelectObject(pNewPen);/畫直線畫直線pDC-MoveTo(200,60+i1*20);pDC-LineTo(340,60+i1*20);/恢復(fù)原有的筆恢復(fù)原有的筆pDC-SelectObject(pOldPen);else /出錯提示出錯提示AfxMessageBox(CreatePen Erroe!);/刪除新筆刪除新筆delete pNewPen;/設(shè)置顏色表設(shè)置顏色
50、表 struct tagColor int r,g,b; color7= 255,0,0,0,255,0,0,0,255, 255,255,0,255,0,255,0,255,255,0,0,0, ; /用不同顏色繪圖用不同顏色繪圖for(i1=0;i1CreatePen(PS_SOLID,2,RGB(colori1.r,colori1.g,colori1.b)pOldPen=pDC-SelectObject(pNewPen);/畫直線畫直線pDC-MoveTo(380,60+i1*20);pDC-LineTo(520,60+i1*20);/恢復(fù)原有的筆恢復(fù)原有的筆pDC-SelectObje
51、ct(pOldPen);else/出錯提示出錯提示AfxMessageBox(CreatePen Erroe!);/刪除新筆刪除新筆delete pNewPen;/畫筆程序結(jié)束畫筆程序結(jié)束 在進行區(qū)域填充或繪制封閉圖形時,需要用到畫刷。在進行區(qū)域填充或繪制封閉圖形時,需要用到畫刷。MFC把把GDI畫刷封裝在畫刷封裝在CBrush類中。畫刷分三種基本類型:類中。畫刷分三種基本類型:純色畫刷、陰影畫刷和圖案畫刷。純色畫刷、陰影畫刷和圖案畫刷。 純色畫刷純色畫刷繪圖使用單色來定義,顏色由繪圖使用單色來定義,顏色由RGB()函數(shù)來函數(shù)來確定。純色畫刷可以采用直接聲明的方法,例如:確定。純色畫刷可以采用
52、直接聲明的方法,例如: CBrush Brush(RGB(255,0,0); 創(chuàng)建一個紅色畫刷。創(chuàng)建一個紅色畫刷。 也可以采用分步方法,由也可以采用分步方法,由CreateSolidBrush()函數(shù)創(chuàng)建。函數(shù)創(chuàng)建。 CBrush Brush; Brush-Create-CreateSolidBrush(RGB(255,0,0);(2)畫刷)畫刷Windows預(yù)定義了七種畫刷預(yù)定義了七種畫刷,包括:包括:BLACK_BRUSH、 DKGRAY_BRUSH、 GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和和WHITE_BRUSH。可以參照??梢詤?/p>
53、照CPen類的方法,采用類的方法,采用CreateStockObject()來使用預(yù)定義的畫刷。來使用預(yù)定義的畫刷。陰影畫刷陰影畫刷使用預(yù)定義的六種陰影樣式進行繪圖。表使用預(yù)定義的六種陰影樣式進行繪圖。表2.3列列出了六種陰影樣式。出了六種陰影樣式。 創(chuàng)建陰影畫刷的方法與純色畫刷的創(chuàng)建方法相似,例如創(chuàng)創(chuàng)建陰影畫刷的方法與純色畫刷的創(chuàng)建方法相似,例如創(chuàng)建一個建一個45度方向的交叉陰影線的畫刷,方法如下:度方向的交叉陰影線的畫刷,方法如下: CBrush Brush(HS_DIAGCROSS,RGB(255,0,0); 或者或者 CBrush Brush; Brush-CreateHatchBrush (HS_DIAGCROSS,RGB(255,0,0); 函數(shù)中有兩個參數(shù),第一個參數(shù)是畫刷的陰影樣式,第二函數(shù)中有兩個參數(shù),第一個參數(shù)是畫刷的陰影樣式,第二個參數(shù)是陰影線的顏色。示例:繪制缺省畫刷的矩形,純色畫個參數(shù)是陰影線的顏色。示例:繪制缺省畫刷的矩形,純色畫刷矩形和繪制刷矩形和繪制100單位的矩形,并且用白色單位的矩形,并且用白色45度交叉線陰影將度交叉線陰影將其填充,程序如下:其填充,程序如下:/畫刷程序畫刷程序pDC-Rectangle(300,300,400,400); /缺省的畫刷,白缺省的畫刷,白色色/純色畫刷
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人房產(chǎn)抵押權(quán)抵押權(quán)轉(zhuǎn)讓合同3篇
- 2025年度個人貸款擔(dān)保轉(zhuǎn)讓合同4篇
- 2025版住宅室內(nèi)精裝修與裝飾工程施工合同5篇
- 人類的起源和發(fā)展課件2
- 出租車行業(yè)環(huán)保措施考核試卷
- 團隊建設(shè)力量培養(yǎng)項目計劃書考核試卷
- 印刷業(yè)科技創(chuàng)新與成果轉(zhuǎn)化考核試卷
- 二零二五年度藝術(shù)品交易居間代理合同樣本3篇
- 2025年創(chuàng)業(yè)創(chuàng)新貸款協(xié)議
- 2025年合作知名作者的高需求小說電子書協(xié)議
- 廣東省佛山市2025屆高三高中教學(xué)質(zhì)量檢測 (一)化學(xué)試題(含答案)
- 人教版【初中數(shù)學(xué)】知識點總結(jié)-全面+九年級上冊數(shù)學(xué)全冊教案
- 2024-2025學(xué)年人教版七年級英語上冊各單元重點句子
- 2024年九年級語文中考名著閱讀《儒林外史》考前練附答案
- 抖音麗人行業(yè)短視頻直播項目運營策劃方案
- 2024年江蘇揚州市邗城文化旅游發(fā)展有限公司招聘筆試參考題庫含答案解析
- 小學(xué)六年級數(shù)學(xué)100道題解分數(shù)方程
- 社區(qū)獲得性肺炎護理查房內(nèi)科
- 淺談提高中學(xué)生歷史學(xué)習(xí)興趣的策略
- 項目管理實施規(guī)劃-無錫萬象城
- 浙大一院之江院區(qū)就診指南
評論
0/150
提交評論