版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Visual C+圖形程序設計基礎圖形程序設計基礎 內容提要內容提要lVisual C+是在是在Microsoft C的基礎上發(fā)展而來的,的基礎上發(fā)展而來的,隨著計算機軟、硬件技術的快速發(fā)展,如今隨著計算機軟、硬件技術的快速發(fā)展,如今Visual C+已成為集編輯、編譯、運行、調試于一體功能強已成為集編輯、編譯、運行、調試于一體功能強大的集成編程環(huán)境。本章以大的集成編程環(huán)境。本章以Visual C+ 6.0為對象,為對象,主要介紹主要介紹Visual C+集成編成環(huán)境的使用、圖形設備集成編成環(huán)境的使用、圖形設備接口和常用圖形程序設計接口和常用圖形程序設計,目的是通過對目的是通過對Visual
2、C+的的學習,掌握學習,掌握Visual C+圖形程序設計的方法,為計算圖形程序設計的方法,為計算機圖形學原理部分的算法實現提供程序工具和方法。機圖形學原理部分的算法實現提供程序工具和方法。 2.1 Visual C+ 6.0應用程序開發(fā)方法應用程序開發(fā)方法l介紹介紹Visual C+ 6.0集成開發(fā)環(huán)境,以一個簡集成開發(fā)環(huán)境,以一個簡單的實例介紹利用單的實例介紹利用Visual C+應用程序工程應用程序工程建立方法和程序設計框架。建立方法和程序設計框架。 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)境由標題欄、工具欄、工作的開發(fā)環(huán)境由標題欄、工具欄、工作區(qū)窗口、源代碼編輯窗口、輸出窗口和狀態(tài)欄區(qū)窗口、源代碼編輯窗口、輸出窗口和狀態(tài)欄組成,見圖組成,見圖2.1所示。所示。 圖圖2.1 Visual C+ 6.0集成開發(fā)環(huán)境集成開發(fā)環(huán)境 標題欄菜單欄工作區(qū)源代碼編輯窗口 狀態(tài)欄 標題欄用于顯示應用程序名和所打開的文件名,標題標題欄用于顯示應用程序名和所打開的文件名,標題欄的顏色可以表明對應窗口是否被激活。菜單欄包括欄的顏色可以表明對應窗口是否被激活。菜單欄包括文件、編輯、顯示、插入、工程、編
4、譯、工具、窗口文件、編輯、顯示、插入、工程、編譯、工具、窗口和幫助九項主菜單,包含了從源代碼的編輯、界面設和幫助九項主菜單,包含了從源代碼的編輯、界面設計、程序調試和編譯運行在內的所有功能。工具欄列計、程序調試和編譯運行在內的所有功能。工具欄列出了常用的菜單命令功能和對象方法。工具欄的下面出了常用的菜單命令功能和對象方法。工具欄的下面是兩個窗口,一個是工作區(qū)窗口,用于列出工程中的是兩個窗口,一個是工作區(qū)窗口,用于列出工程中的各種對象,一個是源代碼編輯窗口,用于各個對象的各種對象,一個是源代碼編輯窗口,用于各個對象的程序設計。輸出窗口顯示項目建立過程中所產生的各程序設計。輸出窗口顯示項目建立過程
5、中所產生的各種信息。屏幕底端是狀態(tài)欄,它給出當前操作或所選種信息。屏幕底端是狀態(tài)欄,它給出當前操作或所選擇命令的提示信息。擇命令的提示信息。2.1.2 應用程序工程的建立方法應用程序工程的建立方法 lVisual C+提供了一種稱為提供了一種稱為App Wizard的工具,利用的工具,利用該工具,用戶可以方便地按照自己的需要創(chuàng)建符合需該工具,用戶可以方便地按照自己的需要創(chuàng)建符合需要的應用程序框架。在這個基礎上,用戶可以進一步要的應用程序框架。在這個基礎上,用戶可以進一步將自己編寫的程序加入到這個框架中,實現用戶程序將自己編寫的程序加入到這個框架中,實現用戶程序的功能。下面介紹建立的功能。下面介
6、紹建立VcApp應用程序框架的方法,應用程序框架的方法,其它應用程序的方法都與此類似。其它應用程序的方法都與此類似。l第一步:啟動第一步:啟動Visual C+,選擇工程方法選擇工程方法l 從開始菜單中選擇從開始菜單中選擇 Visual C+,進入,進入Visual C+集集成環(huán)境。從文件菜單中選擇新建成環(huán)境。從文件菜單中選擇新建(New)命令,命令,2.1.2 應用程序工程的建立方法應用程序工程的建立方法 l彈出圖彈出圖2-2對話框。切換到工程(對話框。切換到工程(Projects)標)標簽,項目類型選擇簽,項目類型選擇MFC AppWizard(exe),輸,輸入工程的名字(如入工程的名字
7、(如VcApp),選擇項目放置的),選擇項目放置的位置,然后單擊位置,然后單擊“確定確定”按鈕。按鈕。圖圖2-2 Visual C+的的New對話框對話框 2.1.2 2.1.2 應用程序工程的建立方法應用程序工程的建立方法 l第二步:設置應用程序的特性。第二步:設置應用程序的特性。l這些設置包括六個問題,每一個問題都有不同的選項這些設置包括六個問題,每一個問題都有不同的選項供選擇。一個問題選擇完后,通過供選擇。一個問題選擇完后,通過“下一步下一步”(Next)選擇下一個問題,直到六個問題選擇完畢。還可以通選擇下一個問題,直到六個問題選擇完畢。還可以通過過“上一步上一步”(Back)返回上一個
8、問題重新選擇。下面返回上一個問題重新選擇。下面繼續(xù)上面的例子,在單擊繼續(xù)上面的例子,在單擊“確定確定”按鈕后,彈出第一按鈕后,彈出第一個問題窗口,如圖個問題窗口,如圖2-3所示。所示。l第一個問題是建立什么類型的應用程序,有三個選項:第一個問題是建立什么類型的應用程序,有三個選項:單個文檔單個文檔( (Single document) )、多重文檔、多重文檔( (Multiple document) )和基本對話和基本對話( (Dialog based) )。2.1.22.1.2 應用程序工程的建立方法應用程序工程的建立方法 l單個文檔應用程序主窗口中只有一個窗口,多重文檔可以單個文檔應用程序
9、主窗口中只有一個窗口,多重文檔可以在主窗口中開多個子窗口,基本對話主窗口是一個對話框。在主窗口中開多個子窗口,基本對話主窗口是一個對話框。例中選擇單個文檔,單擊例中選擇單個文檔,單擊“確定確定”,進入下一個問題,如,進入下一個問題,如圖圖2-4所示。所示。l第二個問題是數據庫的支持,是否用第二個問題是數據庫的支持,是否用ODBC存取數據庫,存取數據庫,有四個選項:不包括數據庫的支持(有四個選項:不包括數據庫的支持(None)、僅包含)、僅包含ODBC頭文件(頭文件(Header files only)、指定一個數據庫但沒)、指定一個數據庫但沒有文件支持和指定一個數據庫但需要文件支持。當選擇了有
10、文件支持和指定一個數據庫但需要文件支持。當選擇了后兩項,則需要用戶選擇一個已經建立的數據庫。例中不后兩項,則需要用戶選擇一個已經建立的數據庫。例中不需要數據庫支持,選擇第一個選項需要數據庫支持,選擇第一個選項“否否”,進入第三個問,進入第三個問題,如圖題,如圖2-5所示所示 圖圖2-3 第一個問題:選擇應用程序的類型第一個問題:選擇應用程序的類型 圖圖2-4 第二個問題:選擇是否要用第二個問題:選擇是否要用ODBC支持支持 l第三個問題是對第三個問題是對ActiveX的支持。有五個選項:的支持。有五個選項:(1)沒有對)沒有對ActiveX的支持;的支持;(2)ActiveX容器容器, ,它可
11、以包含鏈接和嵌入對象。容器不能它可以包含鏈接和嵌入對象。容器不能為其它的為其它的ActiveX程序提供支持程序提供支持, ,它只能維護嵌入對象;它只能維護嵌入對象;(3)微型服務器()微型服務器(Mini-server),應用程序不能獨立運行,),應用程序不能獨立運行,只能被調用為其它程序建立只能被調用為其它程序建立ActiveX對象。對象。(4)完整服務器()完整服務器(Full-server),它能夠獨立運行,并能),它能夠獨立運行,并能夠為其它應用程序建立夠為其它應用程序建立ActiveX對象。對象。(5)容器和服務器,一個應用程序可以同時是容器和服務)容器和服務器,一個應用程序可以同時
12、是容器和服務器。器。l在例子中,選擇第一個選項,沒有對在例子中,選擇第一個選項,沒有對ActiveX的支持,單的支持,單擊擊“下一個下一個”(Next)進入下一個問題。)進入下一個問題。 圖圖2-5 第三個問題:選擇是否對第三個問題:選擇是否對ActiveX的支持的支持 第四個問題是應用程序的特性和高級選項,如下圖第四個問題是應用程序的特性和高級選項,如下圖 圖2-6 應用程序的特性和高級選項 例中全部采用默認選項,進入下一個問題。例中全部采用默認選項,進入下一個問題。第五個問題是項目的風格、原文件注釋和第五個問題是項目的風格、原文件注釋和MFC庫類型,如庫類型,如圖圖2-7所示。所示。在例子
13、中全部采用默認選項,進入第六個問題。在例子中全部采用默認選項,進入第六個問題。第六個問題是確定類名和文件名,如圖第六個問題是確定類名和文件名,如圖2-8所示。所示。 基于第一個問題到第五個問題的回答,基于第一個問題到第五個問題的回答,AppWizard會把會把將要建立的新類的名稱通知用戶。將要建立的新類的名稱通知用戶。AppWizard將為應用將為應用程序建立四個新類,程序建立四個新類,CVcAppApp是應用程序類,它是是應用程序類,它是CWinApp的派生類。的派生類。CMainFrame是一個擁有應用程序是一個擁有應用程序主窗口的類。主窗口的類。CVcAppDoc和和CVcAppView
14、是該應用程序是該應用程序的文檔和視圖類。這些名字用戶可以改變。最后單擊的文檔和視圖類。這些名字用戶可以改變。最后單擊“完成完成”(Finish),顯示所建項目的信息,單擊顯示所建項目的信息,單擊“確定確定”后,項目建立完成。后,項目建立完成。 圖圖2-7 項目的風格、原文件注釋和項目的風格、原文件注釋和MFC庫類型庫類型 圖2-8 通知MFC產生的類名稱 2.1.3 2.1.3 輸入源程序進行程序設計輸入源程序進行程序設計 l應用程序項目工程建立以后,就為應用程序的開發(fā)建立了應用程序項目工程建立以后,就為應用程序的開發(fā)建立了一個框架,這時不輸入任何程序代碼,對該項目程序進行一個框架,這時不輸入
15、任何程序代碼,對該項目程序進行編譯和運行,可以生成一個完整的窗口程序。用戶根據項編譯和運行,可以生成一個完整的窗口程序。用戶根據項目工程中的不同類,輸入自己設計的程序代碼,完成用戶目工程中的不同類,輸入自己設計的程序代碼,完成用戶的程序設計。的程序設計。l例如,從例如,從VcApp Classes中找到中找到CVcAppView的的OnDraw()()函數,如圖函數,如圖2-9所示。雙擊所示。雙擊OnDraw()()函數,這時系統(tǒng)會打函數,這時系統(tǒng)會打開開VcAppView.cpp文件,而且光標正置于文件,而且光標正置于OnDraw()()函數函數中,在其中輸入下列語句:中,在其中輸入下列語句
16、:lpDC-TextOut(30,30,”同學們好,歡迎使用同學們好,歡迎使用VC+編編程!程!”);l編譯并運行該程序,運行結果如圖編譯并運行該程序,運行結果如圖2-10所示。所示。圖2-9 輸入程序源代碼 圖2-10 運行結果 2. .2 圖形設備接口和圖形程序設計圖形設備接口和圖形程序設計 2.2.1 圖形設備接口簡介圖形設備接口簡介 l在在Windows系統(tǒng)中,程序都是通過一個叫做系統(tǒng)中,程序都是通過一個叫做圖形圖形設備接口設備接口(GDI, Graphics Device Interface)的抽象接口的抽象接口和硬件打交道,和硬件打交道,Windows會自動將設備環(huán)境表映會自動將設
17、備環(huán)境表映射到相應的物理設備,并且會提供正確的輸入射到相應的物理設備,并且會提供正確的輸入/輸輸出指令。出指令。lGDI是是Windows系統(tǒng)核心的三種動態(tài)鏈接庫之一,系統(tǒng)核心的三種動態(tài)鏈接庫之一,它管理它管理Windows系統(tǒng)的所有程序的圖形輸出。在系統(tǒng)的所有程序的圖形輸出。在Windows系統(tǒng)中,系統(tǒng)中,GDI向程序員提供了高層次的向程序員提供了高層次的繪圖函數,只要掌握這些繪圖函數,就可以很方繪圖函數,只要掌握這些繪圖函數,就可以很方便地進行圖形程序設計。便地進行圖形程序設計。 lDC是一個數據結構,當程序向是一個數據結構,當程序向GDI設備中繪圖時,設備中繪圖時,需要訪問該設備的需要訪
18、問該設備的DC。MFC將將GDI的的DC封裝在封裝在C+類中,包括類中,包括CDC類和類和CDC派生類,這些類中的許多派生類,這些類中的許多成員都是對本地成員都是對本地GDI繪圖函數進行簡單封裝而形成的繪圖函數進行簡單封裝而形成的內聯(lián)函數。內聯(lián)函數。lDC的作用的作用就是提供程序與物理設備或者虛擬設備之就是提供程序與物理設備或者虛擬設備之間的聯(lián)系,除此之外,間的聯(lián)系,除此之外,DC還要處理繪圖屬性的設置,還要處理繪圖屬性的設置,如文本的顏色等。程序員可以通過調用專門的如文本的顏色等。程序員可以通過調用專門的GDI函函數修改繪圖屬性,如數修改繪圖屬性,如SetTextColor()函數。函數。l
19、CDC類是類是GDI封裝在封裝在MFC中最大的一個類中最大的一個類,它表示,它表示總的總的DC。表。表2.1列出了列出了CDC中的一些常用繪圖函數。中的一些常用繪圖函數。設備描述表設備描述表(DC, Device Context)表表2.1 CDC類中常用繪圖函數類中常用繪圖函數 函函 數數描描 述述使用頻率使用頻率Arc()橢圓弧橢圓弧*BitBlt()把位圖從一個把位圖從一個DC拷貝到另一個拷貝到另一個DC*Draw3dRect()繪制三維矩形繪制三維矩形*DrawDragRect()繪制用鼠標拖動的矩形繪制用鼠標拖動的矩形*DrawEdge()繪制矩形的邊緣繪制矩形的邊緣*DrawIco
20、n()繪制圖標繪制圖標*Ellipse()繪制橢圓繪制橢圓*FillRect()繪制用給定的畫刷顏色填充矩形繪制用給定的畫刷顏色填充矩形*FillRgn()繪制用給定的畫刷顏色填充區(qū)域繪制用給定的畫刷顏色填充區(qū)域*FillSolidRed()繪制用給定的顏色填充矩形繪制用給定的顏色填充矩形*FloodFill()用當前的畫刷顏色填充區(qū)域用當前的畫刷顏色填充區(qū)域*FrameRect()繪制矩形邊界繪制矩形邊界*FrameRgn()繪制區(qū)域邊界繪制區(qū)域邊界*GetBKColor()獲取背景顏色獲取背景顏色*GetCurrentBitmap()獲取所選位圖的指針獲取所選位圖的指針*GetCurren
21、tBrush()獲取所選畫刷的指針獲取所選畫刷的指針*GetCurrentFont()獲取所選字體的指針獲取所選字體的指針*GetCurrentPalette()獲取所選調色板的指針獲取所選調色板的指針*GetCurrentPen()獲取所選畫筆的指針獲取所選畫筆的指針*GetCurrentPosition()獲取畫筆的當前位置獲取畫筆的當前位置*GetDeviceCaps()獲取顯示設備能力的信息獲取顯示設備能力的信息*GetMapMode()獲取當前設置映射模式獲取當前設置映射模式*Getpixel()獲取給定像素的獲取給定像素的RGB顏色值顏色值*GetPolyFillMode()獲取多
22、邊形填充模式獲取多邊形填充模式*GetTextColor()獲取文本顏色獲取文本顏色*GetTextExtent()獲取文本的寬度和高度獲取文本的寬度和高度*GetTextMetrics()獲取當前文本的信息獲取當前文本的信息*GetWindow()獲取獲取DC窗口的指針窗口的指針*GrayString()繪制灰色文本繪制灰色文本*LineTo()繪制直線繪制直線*MoveTo()設置當前畫筆位置設置當前畫筆位置*Pie()繪制餅圖繪制餅圖*Polygon()繪制多邊形繪制多邊形*PolyLine()繪制一組直線繪制一組直線*RealizePalette()將邏輯調色板映射到系統(tǒng)調色板將邏輯調
23、色板映射到系統(tǒng)調色板*Rectangle()繪制矩形繪制矩形*RoundRect()繪制圓角矩形繪制圓角矩形*SelectObject()選擇選擇GDI繪圖對象繪圖對象*SelectPalette()選擇邏輯調色板選擇邏輯調色板*SelectStockObject()選擇預定義圖形對象選擇預定義圖形對象*l這些函數的語法和使用可以通過這些函數的語法和使用可以通過MSDN幫助查詢。幫助查詢。2.2.2節(jié)節(jié)主要介紹主要介紹Windows中基本圖形,包括點、直線、圓、圓中基本圖形,包括點、直線、圓、圓弧、矩形、橢圓、扇形、折線等程序設計弧、矩形、橢圓、扇形、折線等程序設計 SetBkColor()設
24、置背景顏色設置背景顏色*SetMapMode()設置映射模式設置映射模式*SetPixel()把像素設定為給定的顏色把像素設定為給定的顏色*SetTextColor()設置文本顏色設置文本顏色*StretchBlt()把位圖從一個把位圖從一個DC拷貝到另一個拷貝到另一個DC, ,并根據需要擴展或壓縮位圖并根據需要擴展或壓縮位圖*TextOut()繪制字符串文本繪制字符串文本*2.2.2 2.2.2 繪制基本圖形繪制基本圖形 (1)畫點)畫點 SetPixel()函數可以在指定的坐標位置按指定函數可以在指定的坐標位置按指定的顏色畫點。函數原型說明如下:的顏色畫點。函數原型說明如下: COLORR
25、EF CDC: SetPixel(int X, int Y, COLORREF crColor);l其中其中(X,Y)(X,Y)為點的坐標位置,為點的坐標位置,crColor參數為點的參數為點的顏色值。如果函數調用成功,則函數返回像素的顏色值。如果函數調用成功,則函數返回像素的顏色值,否則返回值為顏色值,否則返回值為-1。l顏色值通過顏色值通過RGB(Red,Green,Blue)來設置,其中來設置,其中三個參數取值三個參數取值0255。例如,在。例如,在VcAPP項目中,項目中,在在CVcAppView類中的類中的OnDraw()函數中加入下列函數中加入下列畫點語句:畫點語句:/繪制一組彩色
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);運行程序,查看運行結果。運行程序,查看運行結果。 (2)畫直線和折線)畫直線和折線 l畫直線需要畫直線需要LineTo()和和MoveTo()兩個函數的配合使用。兩個函數的配合使用。lLineTo()函數以當前位置所在的點為直線的起點,另指函數以當前位置所在的點為直線的起點,另指定一個點為直線的終點,畫出一段直線。直線的顏色通定一個點為直線的終點,畫出一段直線。直線的顏色通過畫筆的顏色來設定,在后面介紹。過畫筆的顏色來設定,在后面介紹。LineTo()函數原型函數原型說明如下:說明如下:BOOL CDC: LineTo(int nXEnd, int nYEnd);l直線的終點位
28、置由(直線的終點位置由(nXEnd, nYEnd)指定。如果函)指定。如果函數調用成功,那么該點就成為當前位置,并返回數調用成功,那么該點就成為當前位置,并返回TRUE,否則返回否則返回FALSE。lMoveTo()函數只是將當前位置移動到指定位置,函數只是將當前位置移動到指定位置,它并沒有畫出直線,其函數說明為:它并沒有畫出直線,其函數說明為: BOOL CDC: MoveTo (int X, int Y);示例:示例:在在CVcAppView類中的類中的OnDraw()函數中加函數中加入下列畫點語句:入下列畫點語句:/繪制直線繪制直線 pDC-TextOut(20,60,Line:); p
29、DC-MoveTo(20,90); pDC-LineTo(160,90);Polyline()函數用來畫一條折線,而函數用來畫一條折線,而PolyPolyline()函數則用來畫多條折線,其函數原型說明如下:函數則用來畫多條折線,其函數原型說明如下:BOOL CDC:Polyline(COUST POINT *lppt, int cPoints);BOOL CDC:PolyPolyline(COUST POINT * lppt, COUST DWORD *lpdwPolyPoints, DWORD cCount);在在Polyline()函數中,函數中,lppt是指向折線頂點數組的是指向折線頂
30、點數組的指針,而指針,而cPoints是折線頂點數組中的頂點數。是折線頂點數組中的頂點數。例如,例如,繪制一條具有繪制一條具有4個頂點的折線,程序如下:個頂點的折線,程序如下:POINT polylinepoint4=70,240,20,190, 70,190,20,240;pDC-Polyline(polylinepoint,4);在在PolyPolyline()()函數中,函數中,lppt是指向保存頂是指向保存頂點數組的指針,而各條折線的頂點數則保存在點數組的指針,而各條折線的頂點數則保存在lpdwPolyPoints參數所指向的數組中,最后的參數所指向的數組中,最后的cCount參數指定
31、折線的數目。參數指定折線的數目。例如:例如: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數數組中的數不應該小于組中的數不應該小
32、于2。(3)畫弧線和曲線)畫弧線和曲線 通過通過Arc()函數畫弧線或整個橢圓。橢圓限定在一函數畫弧線或整個橢圓。橢圓限定在一個矩形內,稱為外接矩形。個矩形內,稱為外接矩形。Arc()函數的圓形說明函數的圓形說明如下:如下: BOOL CDC: Arc(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc); l其中其中(nLeftRect, nTopRect)是外接矩形的左上角是外接矩形的左上角坐標值,坐標
33、值,(nRightRect, nBottomRect)是外接矩形是外接矩形的右下角坐標值。而橢圓中心與點的右下角坐標值。而橢圓中心與點(nXStartArc, nYStartArc)所構成的射線與橢圓的交點成為弧線所構成的射線與橢圓的交點成為弧線的起點,橢圓中心與點的起點,橢圓中心與點(nXEndArc, nYEndArc)所所構成的射線與橢圓的交點成為弧線的終點。橢圓構成的射線與橢圓的交點成為弧線的終點。橢圓上從始點到終點就形成一條弧線。上從始點到終點就形成一條弧線。l 在在Windows系統(tǒng)中,弧線從始點到終點的方向是系統(tǒng)中,弧線從始點到終點的方向是逆時針方向,但可以通過逆時針方向,但可以
34、通過SetArcDirection()函數函數將繪制弧線方向設置為順時針方向。將繪制弧線方向設置為順時針方向。 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()函數可以畫出一條或多條函數可以畫出一條或多條Bezier曲線,其函數原曲線,其函數原型說明如下:型說明如下: lBOOL CDC: PolyBezier(CONST POINT * lppt, DWORD cPoints); Bezier曲線其中,其中,lppt
37、參數是曲線控制頂點所組成的數組,參數是曲線控制頂點所組成的數組,cPoints參數表示參數表示lppt數組中的頂點數,一條數組中的頂點數,一條Bezier曲線需曲線需要四個控制頂點。如果要四個控制頂點。如果lppt數組用于畫多條數組用于畫多條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中提供了一組畫封閉曲線的函數,包中提供了一組畫封閉曲線的函數,包括繪制矩形、多邊形、橢圓等,這些畫封閉曲線的括繪制矩形、多邊形、橢圓等,這些畫封閉曲線的函數不但可以利用畫筆來畫出輪廓線,同時還可以函數不但可以利用畫筆來畫出輪廓線,同時還可以利用畫刷來填充這些封閉曲線所圍成的區(qū)域。利用畫刷來填充這些封閉曲線所圍成的區(qū)域。 Rectangle()函數用來畫矩形,
39、其函數原型說明如下:函數用來畫矩形,其函數原型說明如下: BOOL CDC: Rectangle(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); l其中,參數其中,參數nLeftRect和和 nTopRect給出了矩形左給出了矩形左上角的坐標,而上角的坐標,而nRightRect和和 nBottomRect則給則給出矩形的右下角坐標。出矩形的右下角坐標。lEllipse()函數的作用則是畫橢圓形。在函數的作用則是畫橢圓形。在Ellipse()函函數中,橢圓是由其外接矩形來確定的,外接矩形數中,橢圓是由其外接矩形來確定
40、的,外接矩形的中心與橢圓中心重合,矩形的長與寬和橢圓的的中心與橢圓中心重合,矩形的長與寬和橢圓的長短軸相等。函數說明如下:長短軸相等。函數說明如下: BOOL CDC: Ellipse(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect); 其中的參數說明與其中的參數說明與Rectangle()函數相同。函數相同。 RoundRect()函數用來畫圓角矩形,其函數的原型函數用來畫圓角矩形,其函數的原型說明如下:說明如下: BOOL CDC: RoundRect(int nLeftRect, int nTopRect, int
41、 nRightRect, int nBottomRect,int nWidth, int nHeight); 其中的前四個參數與其中的前四個參數與Rectangle()函數相同,函數相同,nWidth表示圓角的寬度表示圓角的寬度, nHeight表示圓角的高度。表示圓角的高度。 Polygon()函數用來畫封閉的任意多邊形,其函數原函數用來畫封閉的任意多邊形,其函數原型說明如下:型說明如下: BOOL CDC: Polygon(COUST POINT *lpPoints, int cCount); 其中的參數說明與其中的參數說明與Polyline()函數相同。但兩個函數相同。但兩個函數有區(qū)別,
42、函數有區(qū)別,Polygon()函數會自動將起點和終點相函數會自動將起點和終點相連形成封閉的多邊形,而連形成封閉的多邊形,而Polyline()函數則畫出多條函數則畫出多條折線,只有當最后一點與起點相同時才畫出封閉的折線,只有當最后一點與起點相同時才畫出封閉的多邊形。多邊形。 示例,示例,繪制矩形、圓角矩形、橢圓和多邊形,繪制矩形、圓角矩形、橢圓和多邊形,程序如下:程序如下:/繪制矩形、圓角矩形、橢圓和多邊形繪制矩形、圓角矩形、橢圓和多邊形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)畫筆)畫筆 當繪制圖形時,線條的屬性,包括顏色、當繪制圖形時,線條的屬性,包括顏色、寬度、樣式等都是由畫筆來確定的。程序員可寬度、樣式等都是由畫筆來確定的。程序員可以創(chuàng)建畫筆,定義畫筆的屬性,從而畫出多彩以創(chuàng)建畫筆,定義畫筆的屬性,從而畫出多彩的圖形。的圖形。方法一:方法一:直接構造一個直接構造一個CPen對象,并將定義畫筆對象,并將定義畫筆的參數傳給它,的參
44、數傳給它,例如:例如: CPen pen(PS-SOLID,1,RGB(255,0,0); 創(chuàng)建一個寬度為一個像素、實線和紅色的畫筆。創(chuàng)建一個寬度為一個像素、實線和紅色的畫筆。 方法二:方法二:首先聲明一個沒有初始化的首先聲明一個沒有初始化的CPen類對象,然類對象,然后再用后再用CreatePen()函數定義畫筆的屬性。例如,函數定義畫筆的屬性。例如, CPen Pen; Pen-CreatePen (PS-SOLID,1,RGB(255,0,0);方法三:方法三:先聲明一個先聲明一個CPen類對象和一個描述畫筆結構類對象和一個描述畫筆結構的的LOGPEN類對象,并填入畫筆的屬性值,然后調類
45、對象,并填入畫筆的屬性值,然后調用用CreatePenIndirect()函數來創(chuàng)建畫筆。如下所示:函數來創(chuàng)建畫筆。如下所示:CPen Pen;LOGPEN LogPen;LogPen.lopnStyle=PS_SOLID;LogPen.lopnWidth=1;LogPen.lpenColor=RGB(255,0,0);Pen.CreatePenIndirect(&LogPen); 如果畫筆被成功創(chuàng)建,那么兩個函數返回如果畫筆被成功創(chuàng)建,那么兩個函數返回TRUE,否則返回否則返回FALSE。 畫筆包括樣式、寬度和顏色三個屬性。表畫筆包括樣式、寬度和顏色三個屬性。表2.2列出了列出了GD
46、I畫筆的樣式。畫筆的樣式。l畫筆的寬度用像素個數來確定。畫筆的寬度用像素個數來確定。PS_DASH、PS_DOT、PS_DASHDOT和和PS_DASHDOTDOT參數要求畫筆寬度參數要求畫筆寬度只能為只能為1,其它參數可以創(chuàng)建任意寬度的畫筆。,其它參數可以創(chuàng)建任意寬度的畫筆。l畫筆的顏色是一個畫筆的顏色是一個24位的位的RGB顏色,由顏色,由RGB(rColor,gColor,bColor)來定義,三個參數取值來定義,三個參數取值0255。lWindows預定義了三個實線、預定義了三個實線、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);/恢復原有的筆恢復原有的筆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);/恢復原有的筆恢復原有的筆pDC-SelectObject(pOldPen);else /出錯提示出錯提示AfxMessageBox(CreatePen Erroe!);/刪除新筆刪除新筆delete pNewPen;/設置顏色表設置顏色
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);/恢復原有的筆恢復原有的筆pDC-SelectObje
51、ct(pOldPen);else/出錯提示出錯提示AfxMessageBox(CreatePen Erroe!);/刪除新筆刪除新筆delete pNewPen;/畫筆程序結束畫筆程序結束 在進行區(qū)域填充或繪制封閉圖形時,需要用到畫刷。在進行區(qū)域填充或繪制封閉圖形時,需要用到畫刷。MFC把把GDI畫刷封裝在畫刷封裝在CBrush類中。畫刷分三種基本類型:類中。畫刷分三種基本類型:純色畫刷、陰影畫刷和圖案畫刷。純色畫刷、陰影畫刷和圖案畫刷。 純色畫刷純色畫刷繪圖使用單色來定義,顏色由繪圖使用單色來定義,顏色由RGB()函數來函數來確定。純色畫刷可以采用直接聲明的方法,例如:確定。純色畫刷可以采用
52、直接聲明的方法,例如: CBrush Brush(RGB(255,0,0); 創(chuàng)建一個紅色畫刷。創(chuàng)建一個紅色畫刷。 也可以采用分步方法,由也可以采用分步方法,由CreateSolidBrush()函數創(chuàng)建。函數創(chuàng)建。 CBrush Brush; Brush-Create-CreateSolidBrush(RGB(255,0,0);(2)畫刷)畫刷Windows預定義了七種畫刷預定義了七種畫刷,包括:包括:BLACK_BRUSH、 DKGRAY_BRUSH、 GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和和WHITE_BRUSH。可以參照??梢詤?/p>
53、照CPen類的方法,采用類的方法,采用CreateStockObject()來使用預定義的畫刷。來使用預定義的畫刷。陰影畫刷陰影畫刷使用預定義的六種陰影樣式進行繪圖。表使用預定義的六種陰影樣式進行繪圖。表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); 函數中有兩個參數,第一個參數是畫刷的陰影樣式,第二函數中有兩個參數,第一個參數是畫刷的陰影樣式,第二個參數是陰影線的顏色。示例:繪制缺省畫刷的矩形,純色畫個參數是陰影線的顏色。示例:繪制缺省畫刷的矩形,純色畫刷矩形和繪制刷矩形和繪制100單位的矩形,并且用白色單位的矩形,并且用白色45度交叉線陰影將度交叉線陰影將其填充,程序如下:其填充,程序如下:/畫刷程序畫刷程序pDC-Rectangle(300,300,400,400); /缺省的畫刷,白缺省的畫刷,白色色/純色畫刷
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年天翼云高級運維工程師認證參考試題庫(含答案)
- “非物質文化遺產”知識競賽參考試題庫300題(含答案)
- 2025年武漢城市職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 合同外包項目服務協(xié)議
- 銷售產品電子合同
- 氫能源行業(yè)的投資機會分析
- 社工勞動合同范本
- 標準正式個人借款合同
- 上海二手房屋買賣房屋合同
- 房地產開發(fā)合同
- 2025年中國南方航空股份有限公司招聘筆試參考題庫含答案解析
- 商務部發(fā)布《中國再生資源回收行業(yè)發(fā)展報告(2024)》
- 2025年福建新華發(fā)行(集團)限責任公司校園招聘高頻重點提升(共500題)附帶答案詳解
- 江蘇省駕校考試科目一考試題庫
- 四川省成都市青羊區(qū)成都市石室聯(lián)合中學2023-2024學年七上期末數學試題(解析版)
- 咨詢公司績效工資分配實施方案
- 2025新人教版英語七年級下單詞表
- 中華護理學會團體標準-氣管切開非機械通氣患者氣道護理
- 未成年入職免責協(xié)議書
- 光伏電站巡檢專項方案
- 2024年山東省東營市中考數學試題 (原卷版)
評論
0/150
提交評論