



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《計算機圖形學》實驗與課程設計張素智編著鄭州輕エ業(yè)學院計算機與通信工程學院2004年12月1日前言實驗1VisualC++圖形程序設計 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、基礎知識和實驗步驟 錯誤!未定義書簽。3.1VisualC++6.0應用程序開發(fā)方法 錯誤!未定義書簽。3.1.1VisualC++的集成開發(fā)環(huán)境 錯誤!未定義書簽。3.1.2應用程序工程的建立方法 錯誤!未定義書簽。3.1.3輸入源程序進行程序設計 錯誤!未定義書簽。3.2圖形設備接口和圖形程序設計 錯誤!未定義書簽。3.2.1圖形設備接口簡介 錯誤!未定義書簽。3.2.2繪制基本圖形 錯誤!未定義書簽。3.2.3畫筆與畫刷 錯誤!未定義書簽。3.2.4文本顯示 錯誤!未定義書簽。3.3鼠標編程 錯誤!未定義書簽。3.3.1鼠標消息處理 錯誤!未定義書簽。3.3.2捕捉鼠標 錯誤!未定義書簽。3.3.3鼠標編程綜合示例 錯誤!未定義書簽。3.4菜單程序設計 錯誤!未定義書簽。4.1菜單編輯器 錯誤!未定義書簽。4.2菜單消息響應 錯誤!未定義書簽。4.3綜合示例 錯誤!未定義書簽。四、實驗總結 錯誤!未定義書簽。實驗二基本圖形(元)生成技術(一) 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、基本知識和實驗步驟 錯誤!未定義書簽。任務ー:實現(xiàn)DDA畫線程序 錯誤!未定義書簽。任務二、放大10倍后,算法演示程序 錯誤!未定義書簽。任務三、加入鼠標功能,實現(xiàn)交互式畫直線 錯誤!未定義書簽。四、實驗結果和分析 錯誤!未定義書簽。五、實驗總結 錯誤!未定義書簽。實驗三基本圖形(元)生成技術(二) 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、實驗內容 錯誤!未定義書簽.任務ー:中點畫圓法的掃描轉換算法 錯誤!未定義書簽。任務二:添加鼠標程序,實現(xiàn)交互式畫圓 錯誤!未定義書簽。任務三:編寫中點畫橢圓法的掃描轉換程序 錯誤!未定義書簽。任務四:添加鼠標程序,實現(xiàn)交互式畫橢圓 錯誤!未定義書簽。四、實驗結果、分析和總結 錯誤!未定義書簽。實驗四 基本圖形處理技術(一) 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、實驗步驟 錯誤!未定義書簽。四、實驗結果、分析和總結 錯誤!未定義書簽。實驗五基本圖形處理技術(二) 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、實驗步驟 錯誤!未定義書簽。任務ー:編碼裁剪算法的程序設計 錯誤!未定義書簽。任務二:用鼠標實現(xiàn)交互式裁剪效果 錯誤!未定義書簽。四、實驗結果和總結 錯誤!未定義書簽。實驗六交互式技術和用戶接口 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、實驗內容和實驗步驟 錯誤!未定義書簽。任務ー:菜單程序設計 錯誤!未定義書簽。任務二:AutoCAD交互式繪圖簡介 錯誤!未定義書簽。四、實驗總結 錯誤!未定義書簽。實驗七曲線與曲面 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、實驗內容和實驗步驟 錯誤!未定義書簽。任務ー:拋物線程序設計 錯誤!未定義書簽。任務二:Hermite曲線程序設計 錯誤!未定義書簽。任務三:Bezier曲線的算法實現(xiàn) 錯誤!未定義書簽。任務四:三次B樣條曲線的算法實現(xiàn) 錯誤!未定義書簽。實驗八二維幾何變換 錯誤!未定義書簽。ー、實驗目的 錯誤!未定義書簽。二、實驗任務 錯誤!未定義書簽。三、實驗內容和實驗步驟 錯誤!未定義書簽。任務ー:根據(jù)數(shù)學模型,編寫幾何變換程序 錯誤!未定義書簽。任務二:利用鼠標實現(xiàn)交互式移動圖形 錯誤!未定義書簽。四、實驗分析和總結 錯誤!未定義書簽。實驗1VisualC++圖形程序設計ー、實驗目的VisualC++是在MicrosoftC的基礎上發(fā)展而來的,隨著計算機軟、硬件技術的快速發(fā)展,如今VisualC++已成為集編輯、編譯、運行、調試于一體功能強大的集成編程環(huán)境。本章以VisualC++6.0為對象,主要介紹VisualC++集成編成環(huán)境的使用、圖形設備接口和常用圖形程序設計、鼠標編程以及菜單設計等基礎,目的是通過對VisualC++的學習,掌握VisualC++圖形程序設計的方法,為計算機圖形學原理部分的算法實現(xiàn)提供程序工具和方法。二、實驗任務.學習VisualC++圖形程序設計的方法;.掌握VisualC++集成編成環(huán)境的使用、圖形設備接口和常用圖形程序設計、鼠標編程、橡皮筋交互技術、畫刷與畫筆以及菜單設計等;三、基礎知識和實驗步驟1VisualC++6.0應用程序開發(fā)方法介紹VisualC++6.0集成開發(fā)環(huán)境,以ー個簡單的實例介紹利用VisualC++應用程序エ程建立方法和程序設計框架。1.1VisualC++的集成開發(fā)環(huán)境從開始菜單中啟動VisualC++6.0,進入開發(fā)集成環(huán)境。打開一個項目后,可以看到VisualC++6.0的開發(fā)環(huán)境由標題欄、工具欄、工作區(qū)窗口、源代碼編輯窗口、輸出窗口和狀態(tài)欄組成,見圖3.1所示。標題欄用于顯示應用程序名和所打開的文件名,標題欄的顏色可以表明對應窗口是否被激活。菜單欄包括文件、編輯、顯示、插入、工程、編譯、工具、窗口和幫助九項主菜單,包含了從源代碼的編輯、界面設計、程序調試和編譯運行在內的所有功能。工具欄列出了常用的菜單命令功能和對象方法。工具欄的下面是兩個窗口,ー個是工作區(qū)窗口,用于列出エ程中的各種對象,ー個是源代碼編輯窗口,用于各個對象的程序設計。輸出窗ロ顯示項目建立過程中所產生的各種信息。屏幕底端是狀態(tài)欄,它給出當前操作或所選擇命令的提示信息。
狀態(tài)欄標題欄菜單欄工作區(qū)源代碼.編輯窗□狀態(tài)欄標題欄菜單欄工作區(qū)源代碼.編輯窗□圖3.1VisualC++6.0集成開發(fā)環(huán)境3.1.2應用程序工程的建立方法VisualC++提供了一種稱為AppWizard的工具,利用該工具,用戶可以方便地按照自己的需要創(chuàng)建符合需要的應用程序框架。在這個基礎上,用戶可以進ー步將自己編寫的程序加入到這個框架中,實現(xiàn)用戶程序的功能。下面介紹建立VcApp應用程序框架的方法,其它應用程序的方法都與此類似。第一步:啟動VisualC++,選擇工程方法從開始菜單中選擇VisualC++,進入VisualC++集成環(huán)境。從文件菜單中選擇新建(New)命令,彈出圖3-2對話框。切換到工程(Projects)標簽,項目類型選擇MFCAppWizard(exe),輸入工程的名字(如VcApp),選擇項目放置的位置,然后單擊"確定"按鈕。第二步:設置應用程序的特性。這些設置包括六個問題,每ー個問題都有不同的選項供選擇。ー個問題選擇完后,通過“下ー步”(Next)選擇下ー個問題,直到六個問題選擇完畢。還可以通過“上ー步"(Back)返回上一個問題重新選擇。下面繼續(xù)上面的例子,在單擊“確定”按鈕后,彈出第一個問題窗口,如圖3-3所示。第一個問題是建立什么類型的應用程序,有三個選項:單個文檔(Singledocument)>多重文檔(Multipledocument)和基本對話(Dialogbased)。單個文檔應用程序主窗口中只有一個窗口,多重文檔可以在主窗口中開多個子窗口,基本對話主窗口是ー個對話框。例中選擇單個文檔,單擊“確定”,進入下ー個問題,如圖3-4所示。第二個問題是數(shù)據(jù)庫的支持,是否用ODBC存取數(shù)據(jù)庫,有四個選項:不包括數(shù)據(jù)庫的支持(None)、僅包含〇DBC頭文件(Headerfilesonly)、指定一個數(shù)據(jù)庫但沒有文件支持和指定一個數(shù)據(jù)庫但需要文件支持。當選擇了后兩項,則需要用戶選擇ー個已經建立的數(shù)據(jù)庫。例中不需要數(shù)據(jù)庫支持,選擇第一個選項“否”,進入第三個問題,如圖3-5所示。圖3-3第一個問題:選擇應用程序的類型圖3-4第二個問題:選擇是否要用ODBC支持
第三個問題是對ActiveX的支持。有五個選項:(1)沒有對ActiveX的支持:(2)ActiveX容器,它可以包含鏈接和嵌入對象。容器不能為其它的ActiveX程序提供支持,它只能維護嵌入對象:(3)微型服務器(Mini-server),應用程序不能獨立運行,只能被調用為其它程序建立ActiveX對象。(4)完整服務器(Full-server),它能夠獨立運行,并能夠為其它應用程序建立ActiveX對象。(5)容器和服務器,ー個應用程序可以同時是容器和服務器。在例子中,選擇第一個選項,沒有對ActiveX的支持,單擊“下ー個"(Next)進入下一個問題。圖3-5 第三個問題:選擇是否對ActiveX的支持第四個問題是應用程序的特性和高級選項,如圖3-6所示。圖3-6應用程序的特性和高級選項例中全部采用默認選項,進入下ー個問題。第五個問題是項目的風格、原文件注釋和MFC庫類型,如圖3-7所示。在例子中全部采用默認選項,進入第六個問題。第六個問題是確定類名和文件名,如圖3-8所示。基于第一個問題到第五個問題的回答,AppWizard會把將要建立的新類的名稱通知用戶。AppWizard將為應用程序建立四個新類,CVcAppApp是應用程序類,它是CWinApp的派生類。CMainFrame是一個擁有應用程序主窗口的類。CVcAppDoc和CVcAppView是該應用程序的文檔和視圖類。這些名字用戶可以改變。最后單擊“完成"(Finish),顯示所建項目的信息,單擊“確定”后,項目建立完成。圖3-7項目的風格、原文件注釋和MFC庫類型圖3-8通知MFC產生的類名稱3.1.3輸入源程序進行程序設計應用程序項目工程建立以后,就為應用程序的開發(fā)建立了一個框架,這是不輸入任何
程序代碼,對該項目程序進行編譯和運行,可以生成一個完整的窗口程序。用戶根據(jù)項目エ程中的不同類,輸入自己設計的程序代碼,完成用戶的程序設計。例如,從VcAppClasses中找到CVcAppView的OnDraw()函數(shù),如圖3-9所示。雙擊OnDraw〇函數(shù),這時系統(tǒng)會打開文件,而且光標正置于OnDraw〇函數(shù)中,在其中輸入下列語句:pDc->TextOut(30,30,”同學們好,歡迎使用VC++編程!つ;編譯并運行該程序,運行結果如圖3-10所示。VcApp-創(chuàng)天中文VC卄-[VcAppView.cpp?] 臼同的? :小國-VcAppclasses+yCAboutDIg,??號CMainFrame+セCVcAppApp+FCVcAppDoc? :小國-VcAppclasses+yCAboutDIg,??號CMainFrame+セCVcAppApp+FCVcAppDoc-?:CVcAppView?AssertValidQ
%CVcAppViewQ?'CVcAppViewO?Dump(CDump?GetDocument|9^OnBeginPrinti?OnDrawfCDC,OnEndPrintinc9#OnPreparePrii?PreCreateWin+QjGlobals國づ00電瓚つ▼口因君聃[ 3?|CVcAppView classmembers]▼!!<OnDraw '圖國 もBOOLCUcAppUiew::PreCreateVindow(CREATESTRUCT&cs)<//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCUiew::PreCreateWindow(cs);>〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃ノノ〃ノ〃//CUcAppUiewdrawinguoidCUcAppUiew::OnDraw(CDC?pDC)<_CUcAppDoc*pDoc-GetDocument();ASSERT_UALID(pDoc);//TODO:adddrawcodefornatiuedataherepDc->TextOut(30,30,“同學們好,歡迎使用UC?+編程| |>〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃〃ノノ〃〃〃〃〃〃〃〃〃〃ノ〃//CUcAppUiewprinting-5Cl...I^Re...lJOFII...IReady Ln61,Col57|REC|COL|oVR|rEAD-5Cl...I^Re...lJOFII...I圖3-9輸入程序源代碼圖3?10運行結果3.2圖形設備接口和圖形程序設計3.2.1圖形設備接口簡介在Windows系統(tǒng)中,程序都是通過一個叫做圖形設備接口(GDI,GraphicsDeviceInterface)的抽象接口和硬件打交道,Windows會自動將設備環(huán)境表映射到相應的物理設備,并且會提供正確的輸入/輸出指令。GDI是Windows系統(tǒng)核心的三種動態(tài)鏈接庫之ー,它管理Windows系統(tǒng)的所有程序的圖形輸出。在Windows系統(tǒng)中,GDI向程序員提供了高層次的繪圖函數(shù),只要掌握這些繪圖函數(shù),就可以很方便地進行圖形程序設計。另ー個概念是設備描述表(DC,DeviceContext)。DC是一個數(shù)據(jù)結構,當程序向GDI設備中繪圖時,需要訪問該設備的DC。MFC將GDI的DC封裝在C++類中,包括CDC類和CDC派生類,這些類中的許多成員都是對本地GDI繪圖函數(shù)進行簡單封裝而形成的內聯(lián)函數(shù)。DC的作用就是提供程序與物理設備或者虛擬設備之間的聯(lián)系,除此之外,DC還要處理繪圖屬性的設置,如文本的顏色等。程序員可以通過調用專門的GDI函數(shù)修改繪圖屬性,如SetTextColor()函數(shù)。CDC類是GDI封裝在MFC中最大的ー個類,它表示總的DC。表3.1列出了CDC中的ー些常用繪圖函數(shù)。表3.1CDC類中常用繪圖函數(shù)函數(shù)描述使用頻率Arc()橢圓弧****BitBlt()把位圖從ー個DC拷貝到另ー個DC:::Draw3dRect()繪制三維矩形**DrawDragRect()繪制用鼠標拖動的矩形匚:DrawEdge()繪制矩形的邊緣**Drawlcon()繪制圖標***Ellipse()繪制橢圓****FillRectO繪制用給定的畫刷顏色填充矩形***FillRgnQ繪制用給定的畫刷顏色填充區(qū)域***FilISolidRed()繪制用給定的顏色填充矩形キ**FloodFill()用當前的畫刷顏色填充區(qū)域***FrameRect()繪制矩形邊界**FrameRgn()繪制區(qū)域邊界**GetBKColorO獲取背景顏色*****GetCurrentBitmapO獲取所選位圖的指針GetCurrentBrush()獲取所選畫刷的指針***GetCurrentFont()獲取所選字體的指針***GetCurrentPalette()獲取所選調色板的指針***GetCurrentPen()獲取所選畫筆的指針***GetCurrentPosition()獲取畫筆的當前位置****GetDeviceCaps()獲取顯示設備能力的信息**
GetMapMode()獲取當前設置映射模式***Getpixel()獲取給定像素的RGB顏色值*****GetPolyFillModeO獲取多邊形填充模式***GetTextColor()獲取文本顏色****GetTextExtent()獲取文本的寬度和高度:::二:GetTextMetrics()獲取當前文本的信息**GetWindow()獲取DC窗口的指針**GrayStringO繪制灰色文本***LineTo()繪制直線******MoveTo()設置當前畫筆位置******Pie()繪制餅圖***Polygon()繪制多邊形***PolyLine()繪制ー組直線***RealizePalette()將邏輯調色板映射到系統(tǒng)調色板::::::Rectangle()繪制矩形****RoundRect()繪制圓角矩形***SelectObject()選擇GDI繪圖對象**SelectPalette()選擇邏輯調色板**SelectStockObject()選擇預定義圖形對象**SetBkColor()設置背景顏色******SetMapMode()設置映射模式***SetPixeK)把像素設定為給定的顏色******SetTextColor()設置文本顏色******StretchBltO把位圖從ー個DC拷貝到另ー個DC,并根據(jù)需要擴展或壓縮位圖*TextOutO繪制字符串文本*****這些函數(shù)的語法和使用可以通過MSDN幫助查詢。3.2.2節(jié)主要介紹Windows中基本圖形,包括電、直線、圓、圓弧、矩形、橢圓、扇形、折線等程序設計3.2.2繪制基本圖形(1)畫點SetPixel()函數(shù)可以在指定的坐標位置按指定的顏色畫點。函數(shù)原型說明如下:COLORREFCDC::SetPixel(intX,intY,COLORREFcrColor);其中,(X,Y)為點的坐標位置,crColor參數(shù)為點的顏色值。如果函數(shù)調用成功,則函數(shù)返回像素的顏色值,否則返回值為ー1。顏色值通過RGB(Red,Green,Blue)來設置,其中三個參數(shù)取值0-2550例如,在VcAPP項目中,在CVcAppView類中的OnDraw()函數(shù)中加入下列畫點語句:〃繪制ー組彩色點〃繪制ー組彩色點pDC->TextOut(20,20,"point:");pDC->SetPixel(100,20,RGB(255,0,0));pDC->SetPixel(110,20,RGB(0,255,0));pDC->SetPixel(l20,20,RGB(0,0,255));pDC->SetPixel(l00,20,RGB(255,255,0));pDC->SetPixel(100,20,RGB(255,0,255));pDC->SetPixel(lOO,2O,RGB(O,255,255));pDC->SetPixel(l00,20,RGB(0,0,0));pDC->SetPixel(100,20,RGB(255,255,255));運行程序,查看運行結果。(2)畫直線和折線畫直線需要LineTo。和MoveTo。兩個函數(shù)的配合使用。LineTo。函數(shù)以當前位置所在的點為直線的起點,另指定一個點為直線的終點,畫出ー段直線。直線的顏色通過畫筆的顏色來設定,在后面介紹。LineToO函數(shù)原型說明如下:BOOLCDC::LineTo(intnXEnd,intnYEnd);直線的終點位置由(nXEnd,nYEnd)指定。如果函數(shù)調用成功,那么該點就成為當前位置,并返回TRUE,否則返回FALSE。MoveTo()函數(shù)只是將當前位置移動到指定位置,它并沒有畫出直線,其函數(shù)說明為:BOOLCDC::MoveTo(intX,intY);示例:在CVcAppView類中的OnDraw。函數(shù)中加入下列畫點語句:〃繪制直線pDC->TextOut(20,60:'Line:H);pDC->MoveTo(20,90);pDC->LineTo(160,90);Polyline。函數(shù)用來畫一條折線,而PolyPolyline()函數(shù)則用來畫多條折線,它們的函數(shù)原型說明如下:BOOLCDC::Polyline(COUSTPOINT*lppt,intePoints);BOOLCDC::PolyPolyline(COUSTPOINT*Ippt,COUSTDWORD*lpdwPolyPoints,DWORDcCount);在Polyline。函數(shù)中,Ippt是指向折線頂點數(shù)組的指針,而ePoints是折線頂點數(shù)組中的頂點數(shù)。例如,繪制一條具有4個頂點的折線,程序如下:POINTpolylinepoint[4]={{70,240},{20,190},{70,190),{20,240}};pDC->Polyline(polylinepoint,4);在PolyPolyline()函數(shù)中,Ippt是指向保存頂點數(shù)組的指針,而各條折線的頂點數(shù)則保存在IpdwPolyPoints參數(shù)所指向的數(shù)組中,最后的cCount參數(shù)指定折線的數(shù)目。例如:POINTpolypolylinePt[9]={{95,160),{120,185),{120,250},(145,160},{120,185},{90,185},{150,185},{80,210},{160,210}};DWORDdwPolyPoints⑷={3,2,2,2};〃分四段折線,分別占用3,2,2,2個頂點pDC->PolyPolyline(polypolylinePt,dwPolyPoints,4);注:由于一條折線至少需要2個頂點,因此dwPolyPoints數(shù)組中的數(shù)不應該小于2〇(3)畫弧線和曲線通過Arc。函數(shù)畫弧線或整個橢圓。橢圓限定在ー個矩形內,稱為外接矩形。Arc。函數(shù)的圓形說明如下:BOOLCDC::Arc(intnLeftRect,intnTopRect,intnRightRect,intnBottomRect,intnXStartArc,intnYStartArc,intnXEndArc,intnYEndArc);其中,(nLeftRect,nTopRect)是外接矩形的左上角坐標值,(nRightRect,nBottomRect)是外接矩形的右下角坐標值。而橢圓中心與點(nXStartArc,nYStartArc)所構成的射線與橢圓的交點成為弧線的起點,橢圓中心與點(nXEndArc,nYEndArc)所構成的射線與橢圓的交點成為弧線的終點。橢圓上從始點到終點就形成一條弧線。在Windows系統(tǒng)中,弧線從始點到終點的方向是逆時針方向,但可以通過SetArcDirection。函數(shù)將繪制弧線方向設置為順時針方向。示例,用Arc。繪制圓、圓弧和橢圓,程序如下:for(i=0;i<6;i++){pDC->Arc(260-5*i,70-5*i,260+5*1,70+5*i,260+5*i,70,260+5*i,70);}for(i=3;i<6;i++)(pDC->Arc(260-10*i,70-10*i,260+10巧,70+10*i,(int)260+10*i*cos(60*3./l80),(int)70+10*i*sin(60*3./180),(int)260+10*i*cos(60*3./l80),(int)70-10*i*sin(60*3./180));pDC->Arc(260-10*i,70-10*i,260+10*i,70+1〇?i,(int)260-l0*i*cos(60*3./l80),(int)70-l0*i*sin(60*3./l80),(int)260-l0*i*cos(60*3./l80),(int)70+10*i*sin(60*3./l80));)Bezier曲線是最常見的非規(guī)則曲線之一。Bezier曲線屬于三次曲線,需要四個控制頂點來確定一條Bezier曲線,其中曲線通過第一點和最后一點,并且第一條邊和最后一條邊是曲線在起點和終點處的切線,從而確定了曲線的走向。PolyBezier。函數(shù)可以畫出一條或多條Bezier曲線,其函數(shù)原型說明如下:BOOLCDC::PolyBezier(CONSTPOINT*Ippt,DWORDePoints);其中,Ippt參數(shù)是曲線控制頂點所組成的數(shù)組,ePoints參數(shù)表示Ippt數(shù)組中的頂點數(shù),一條Bezier曲線需要四個控制頂點。如果Ippl數(shù)組用于畫多條Bezier曲線,第二條以后的曲線只需要三個控制頂點,因為后面的曲線總是把前一條曲線的終點作為自己的起點。示例,給出四個控制頂點,畫出一條Bezier曲線和特征多邊形。〃繪制Bezier曲線POINTpolyBezier[4]={{20,310},{60,240|,{l20,300},{160,330)};pDC->Polyline(polyBezier,4);pDC->PolyBezier(polyBezier,4);(4)畫封閉曲線Windows中提供了一組畫封閉曲線的函數(shù),包括繪制矩形、多邊性、橢圓等,這些畫封閉曲線的函數(shù)不但可以利用畫筆來畫出輪廓線,同時還可以利用畫刷來填充這些封閉曲線所圍成的區(qū)域。Rectangle。函數(shù)用來畫矩形,其函數(shù)原型說明如下:BOOLCDC::Rectangle(intnLeftRect,intnTopRect,intnRightRect,intnBottomRect);其中,參數(shù)nLeftRect和nTopRecl給出了矩形左上角的坐標,而nRightRecl和nBottomRect則給出矩形的右下角坐標。Ellipse。函數(shù)的作用則是畫橢圓形。在Ellipse。函數(shù)中,橢圓是由其外接矩形來確定的,外接矩形的中心與橢圓中心重合,矩形的長與寬和橢圓的長短軸相等。函數(shù)說明如下:BOOLCDC::Ellipse(intnLeftRect,intnTopRect,intnRightRect,intnBottomRect);其中的參數(shù)說明與Rectangle。函數(shù)相同。RoundRect。函數(shù)用來畫圓角矩形,其函數(shù)的原型說明如下:BOOLCDC::RoundRect(intnLeftRect,intnTopRect,intnRightRect,intnBottomRect,intnWidth,intnHeight);其中的前四個參數(shù)與Rectangle。函數(shù)相同,nWidth表示圓角的寬度,nHeight表示圓角的高度。Polygon。函數(shù)用來畫封閉的任意多邊形,其函數(shù)原型說明如下:BOOLCDC::Polygon((COUSTPOINT*lpPoints,intcCount);其中的參數(shù)說明與Polyline。函數(shù)相同。但兩個函數(shù)有區(qū)別,Polygon。函數(shù)會自動將起點和終點相連形成封閉的多邊形,而Polyline。函數(shù)則畫出多條折線,只有當最后一點與起點相同時オ畫出封閉的多邊形。示例,繪制矩形、圓角矩形、橢圓和多邊形,程序如下:〃繪制矩形、圓角矩形、橢圓和多邊形pDC->Rectangle(l90,270,250,310);pDC->RoundRect(265,270,330,310,30,20);pDC->Ellipse(260-50,200-30,260+50,200+30);POINTpolygonPts[3]={{390,160),(430,220),{350,210});pDC->Polygon(polygonPts,3);3.2.3畫筆與畫刷(i)畫筆當繪制圖形時,線條的屬性,包括顏色、寬度、樣式等都是由畫筆來確定的。程序員可以創(chuàng)建畫筆,定義畫筆的屬性,從而畫出多彩的圖形。創(chuàng)建畫筆包括CreatePen。和CreatePenlndirect。兩個函數(shù)。MFC將這些函數(shù)封裝在CPen類中,這樣畫筆就能夠被視為對象進行處理。下面介紹創(chuàng)建畫筆的方法。方法一:直接構造一個CPen對象,并將定義畫筆的參數(shù)傳給它,例如:CPenpen(PS-SOLID,l,RGB(255,0,0));創(chuàng)建一個寬度為ー個像素、實線和紅色的畫筆。方法二:首先聲明一個沒有初始化的CPen類對象,然后再用CreatePen。函數(shù)定義畫筆的屬性。例如,CPenPen;Pen->CreatePen(PS-SOLID,1,RGB(255,0,0));方法三:先聲明一個CPen類對象和一個描述畫筆結構的LOGPEN類對象,并填入畫筆的屬性值,然后調用CreatePenlndirect。函數(shù)來創(chuàng)建畫筆。如下所示:CPenPen;LOGPENLogPen;tyle=PS_SOLID;idth=l;olor=RGB(255,0,0);ePen!ndirect(&LogPen);如果畫筆被成功創(chuàng)建,那么兩個函數(shù)返回TRUE,否則返回FALSE。畫筆包括樣式、寬度和顏色三個屬性。表3.2列出了GDI畫筆的樣式。表3.2GDI畫筆的樣式樣式說明PS_SOLID創(chuàng)建實線筆PS.DASH創(chuàng)建虛線筆,只有當畫筆寬度小于或等于1時有效PS_DOT創(chuàng)建點線筆,只有當畫筆寬度小于或等于1時有效PS.DASHDOT點劃線筆,只有當畫筆寬度小于或等于1時有效PS_DASHDOTDOT雙點劃線筆,只有當畫筆寬度小于或等于1時有效PS_NULL創(chuàng)建NULL筆,不繪制任何圖形PSJNSIDEFRAME創(chuàng)建可以在封閉框架內部繪制直線的畫筆。畫筆的寬度用像素個數(shù)來確定。PS_DASHヽPS_DOTヽPS_DASHDOT和PS一DASHDOTDOT參數(shù)要求畫筆寬度只能為1,其它參數(shù)可以創(chuàng)建任意寬度的畫筆。畫筆的顏色是ー個24位的RGB顏色,由RGB(rColor,gColor,bColor)來定義,三個參數(shù)取值〇?255。Windows預定義了三個實線、1個像素寬的畫筆,它們是WHITE一PEN、BLACK_PEN和NULL.PEN,程序中可以直接使用這些畫筆,方法如下:CPenPen;eStockObject(WHITE_PEN);示例:在屏幕上繪制三組直線,第一組按不同線型繪制,第二組按不同寬度繪制,第三組按不同顏色繪制。程序如下:〃畫筆的樣式、寬度和顏色intil;intnPenStyle[]=(PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,PSJNSIDEFRAME,);CPen*pNewPen;CPen*pOldPen;〃用不同樣式的畫筆for(il=0;il<7;il++)(〃構造新筆pNewPen=newCPen;if(pNewPen->CreatePen(nPenStyle[il],l,RGB(0,0,0)))(pOldPen二pDC->SelectObject(pNewPen);〃選擇新筆,并保存舊筆〃畫直線pDC->MoveTo(20,60+i1*20);pDC->LineTo(l60,60+il*20);〃恢復原有的筆pDC->SelectObject(pOldPen);)else(〃出錯提示AfxMessageBox(℃reatePenErroe!!H);)〃刪除新筆deletepNewPen;〃用不同的寬度的筆繪圖for(il=0;il<7;il++)(〃構造新筆pNewPen=newCPen;if(pNewPen->CreatePen(PS_SOLID,il+l,RGB(O,O,O))){pOldPen=pDC->SelectObject(pNewPen);〃畫直線pDC->MoveTo(200,60+i1*20);pDC->LineTo(340,60+i1*20);〃恢復原有的筆pDC->SelectObject(pOldPen);)else(〃出錯提示AfxMessageBox(℃reatePenErroe!!n);}〃刪除新筆deletepNewPen;}〃設置顏色表structtagColor(intr,g,b;}color[7]=({255,0,0},{0,255,0},{0,0,255},{255,255,0),{255,0,255),{0,255,255},{0,0,0),};〃用不同顏色繪圖for(il=0;il<7;il++)(〃構造新筆pNewPen=newCPen;if(pNewPen->CreatePen(PS_SOLID,2,RGB(color|i1].r,color|i1].g,color[i1].b))){pOldPen=pDC->SelectObject(pNewPen);〃畫直線pDC->MoveTo(380,60+i1*20);pDC->LineTo(520,60+il*20);〃恢復原有的筆pDC->SelectObject(pOldPen);)else〃出錯提示AfxMessageBox(nCreatePenErroe!!n);)〃刪除新筆deletepNewPen;)〃畫筆程序結束(2)畫刷在進行區(qū)域填充或繪制封閉圖形時,需要用到畫刷。MFC把GD!畫刷封裝在CBrush類中。畫刷分三種基本類型:純色畫刷、陰影畫刷和圖案畫刷。純色畫刷繪圖使用單色來定義,顏色由RGB()函數(shù)來確定。純色畫刷可以采用直接聲明的方法,例如:CBrushBrush(RGB(255,O,O));創(chuàng)建一個紅色畫刷。也可以采用分步方法,由CreateSolidBrush()函數(shù)創(chuàng)建。CBrushBrush;Brush->Create->CreateSolidBrush(RGB(255,0,0));Windows預定義了七種畫刷,包括:BLACK_BRUSHヽDKGRAY_BRUSHヽGRAY一BRUSH、LTGRAY一BRUSH、HOLLOW一BRUSH、NULL一BRUSH和WHITE一BRUSH。可以參照CPen類的方法,采用CreateStockObjectO來使用預定義的畫刷。陰影畫刷使用預定義的六種陰影樣式進行繪圖。表3.3列出了六種陰影樣式。表3.3六種陰影樣式陰影樣式說明HS_BDIAGONAL45度向下陰影線(從左到右)HS_CROSS水平線與垂直線交叉陰影HS_DIAGCROSS45度方向的交叉陰影線HS.FDIAGONAL45度向上陰影線(從左到右)HS.HORIZONTAL水平陰影線HS.VERTICAL垂直陰影線創(chuàng)建陰影畫刷的方法與純色畫刷的創(chuàng)建方法相似,例如創(chuàng)建一個45度方向的交叉陰影線的畫刷,方法如下:CBrushBrush(HS_DlAGCROSS,RGB(255,0,0));或者CBrushBrush;Brush->CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));函數(shù)中有兩個參數(shù),第一個參數(shù)是畫刷的陰影樣式,第二個參數(shù)是陰影線的顏色。示例:繪制缺省畫刷的矩形,純色畫刷矩形和繪制100單位的矩形,并且用白色45度交叉線陰影將其填充,程序如下:〃畫刷程序pDC->Rectangle(300,300,400,400);〃缺省的畫刷,白色〃純色畫刷CBrush*pNewBrushl;CBrush*pOldBrushl;pNewBrush1=newCBrush;if(pNewBrushl->CreateSolidBrush(RGB(255,0,0)))(〃選擇新畫刷pOldBrush1=pDC->SelectObject(pNewBrush1);〃繪制矩形pDC->Rectangle(200,200,300,400);〃恢復原有畫刷pDC->SelectObject(pOldBrush1);)deletepNewBrush1;〃陰影畫刷CBrushBrush(HS_DIAGCROSS,RGB(255,255,255));CBrush*pOldBrush;pOldBrush=pDC->SelectObject(&Brush);pDC->SetBkColor(RGB(192,192,192));pDC->Rectangle(O,0,100,100);pDC->SelectObject(pOldBrush);3.2.4文本顯示Windows可以顯示很多數(shù)據(jù),包括在窗口中顯示文本信息。由于文本是以圖像的形式顯示在窗口中的,因此需要處理設備描述表(DC),另外還需要對文本字體的處理,包括:文本的顯示、文本的顏色、字符的間距和文本的對齊方式等。(1)文本顯示在擁有一個設備描述表以后,就可以調用TextOut。函數(shù)來顯示文本行。例如:pDC->TextOut(20,20,*Thisisalineoftext.M);TextOut。函數(shù)的三個參數(shù)分別是輸出文本的X坐標和丫坐標以及輸出文本串。(2)設置文本顏色在默認情況下,Windows繪制黑色文本。可以通過SetTextColor。函數(shù)改變文本的顏色。例如:CDC*pDC=GetDC(); 〃聲明一個設備描述表pDClpDC->SetTextColor(RGB(255,0,0));〃設置文本顏色為紅色可以通過GetTextColor。函數(shù)檢索到當前文本的顏色,例如:COLORREFcolor=pDC->GetTextColor();SetBkColorO和GetBkColor。函數(shù)用于設置背景顏色和獲取當前的背景顏色。(2)設置字符間距SetTextCharacterExtra。函數(shù)用來設置文本字符的間距,GetTextCharacterExtra。用來獲得當前文本字符的間距,函數(shù)說明如下:pDC->SetTextCharacterExtra(space);intspace=pDC->GetTextCharacterExtra();其中,space表示在文本字符之間使用的額外空間的像素數(shù)。(3)設置文本的對齊方式SetTextAlign。函數(shù)用于設置顯示文本的對齊方式,函數(shù)說明如下:pDC->SetTextAlign(alignment);其中,alignment參數(shù)取值:TA_LEFT、TA_CENTER和TA_RIGHT,分別表示左對齊、居中方法和右對齊。Alignment參數(shù)取值:TA_TOP、TA_BOTTOM和TA_BASELINE分別表示文本在垂直方向的對齊方式,上對齊、下對齊和字符的基線對齊。3.3鼠標編程在圖形操作系統(tǒng)中,鼠標是最重要的輸入設備之一。Windows系統(tǒng)為用戶提供了統(tǒng)ー的鼠標編程接口,而不必過多了解其底層的知識。Windows是基于消息傳遞、事件驅動的操作系統(tǒng),當用戶移動鼠標、按下或釋放鼠標鍵時都會產生鼠標消息。應用程序可以接收10種鼠標消息,表3.3列出了這些鼠標消息和它們的描述。表3.3鼠標消息和描述消息描述WM.LBUTTONDBLCLK鼠標左鍵被雙擊WM_LBUTTONDOWN鼠標左鍵被按下WM_LBUTTONUP鼠標左鍵被釋放WM_MBUTTONDBLCLK鼠標中鍵被雙擊WM_MBUTTONDOWN鼠標中鍵被按下WM_MBUTTONUP鼠標中鍵被釋放WM.MOUSEMOVE鼠標移動穿過對象區(qū)域WM_RBUTTONDBLCLK鼠標右鍵被雙擊WM_RBUTTONDOWN鼠標右鍵被按下WM_RBUTTONUP鼠標右鍵被釋放3.1鼠標消息處理MFC把鼠標消息處理函數(shù)封裝在CView類中,它們分別是:OnMouseMove(UINTnFlags,CPointpoint);OnLButtonDblclk(UINTnFlags,CPointpoint);OnLButtonDown(UINTnFlags,CPointpoint);OnLButtonUp(UINTnFlags,CPointpoint);分別對應表3.3中10個鼠標消息。在鼠標處理函數(shù)中,point參數(shù)代表鼠標熱點處的坐標位置,point.x為橫坐標,point.y為縱坐標。默認坐標原點(0,0)位于窗口的左上角。由于應用程序要求自動捕獲鼠標事件,因此應當采用Windows事件處理函數(shù),而不是成員函數(shù),具體使用方法參見3.3.3節(jié)示例程序。nFlags參數(shù)中包含了鼠標按鈕和健盤組合使用標志,用來描述鼠標按鈕和鍵盤上的Shift鍵和Ctrl鍵的組合狀態(tài)。nFlag參數(shù)取值范圍:MK_LBUTTON:鼠標左鍵被按下;MK_RBUTTON:鼠標右鍵被按下;MK_MBUTTON!鼠標中鍵被按下;MK_SHIFT:鍵盤上的Shift鍵被按下;MK_CONTROL!鍵盤上的Ctrl鍵被按下;如果想知道某個鍵是否被按下,可用對應的位屏蔽值與nFlags參數(shù)作按位邏輯“與”運算,所的結果若為非零值,則表示該按鈕被按下,例如:if(nFlags&LBUTTON)AfxMessageBox(4lLButtonispresseddown!”)ElseAfxMessageBox("LButtonispressedUp!");如何區(qū)分兩次單擊和一次雙擊,這取決于兩次按下按鈕之間的時間間隔,只有當時間間隔小于一定值時オ被認為是一次雙擊。Windows默認的時間為500ms,可以用SetDoubleClickTime。函數(shù)來重新設置時間間隔值。若要使窗口函數(shù)能接收到鼠標雙擊產生的消息,在注冊窗口類時,必須指明該窗口具有CS_DBLCLKS風格,否則,即使進行了雙擊操作,該窗口也只能收到兩條“WM一LBUTTONDOWN"和"WM一LBUTTONUP”消息,例如;=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;3.3.2捕捉鼠標在交互式圖形程序設計中,經常要使用鼠標的位置拾取、拖動或拖放,這些動作必須進行鼠標的捕捉。鼠標捕捉只需要調用CWnd::SetCapture()函數(shù)。用戶完成鼠標捕捉工作后一般是響應ー個鼠標按下信息,要釋放鼠標捕捉則是調用CWnd::ReleaseCapture()函數(shù)。釋放被捕捉鼠標的最好時間是在響應鼠標彈起的時候(WM一LBUTTON)。3.3.3鼠標編程綜合示例示例1;在窗口中以文本的形式給出鼠標的狀態(tài),即當鼠標移動時,給出鼠標的位置;當鼠標按下鼠標左、右鍵時顯示出鼠標按鍵狀態(tài)。例如,當鼠標左鍵按下時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市社區(qū)體衛(wèi)融合的公共服務供給模式
- 財務風險視角下電氣企業(yè)內控管理策略
- 小學輔導班管理制度
- 總公司倉庫管理制度
- 新能源工程管理制度
- 柴油儲備間管理制度
- 標識類公司管理制度
- 檢測后血液管理制度
- 檢驗科公章管理制度
- 模具加熱棒管理制度
- 工作分析實務-國家開放大學電大易考通考試題目答案
- 急性呼吸窘迫綜合征的護理課件(演示)
- 2025年廣州市越秀區(qū)建設街招考聘用勞動保障監(jiān)察協(xié)管員高頻重點提升(共500題)附帶答案詳解
- 醫(yī)療器械產品運輸質量保證措施
- 2025年寧夏銀川市靈武市文化旅游投資開發(fā)有限公司招聘筆試參考題庫附帶答案詳解
- 《寶鋼集團財務共享中心建設的案例探析》1600字
- 鐵路工務應急處置課件
- 燃氣行業(yè)法律法規(guī)培訓
- T-GDHES 003-2024 預應力混凝土U形板樁應用技術規(guī)程
- 八不傷害培訓課件
- 出鏡記者與現(xiàn)場報道知到智慧樹章節(jié)測試課后答案2024年秋武漢學院
評論
0/150
提交評論