版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、從MFC示例開始6.1 圖形繪制的基礎知識6.2 VC的文本操作6.3 CDC的繪圖操作6.3 Windows繪圖工具本章內容 教學要點 本章內容包括設備環(huán)境與繪圖程序的關系,設備環(huán)境主要功能以在MFC對應的CDC類,利用設備環(huán)境類CDC操縱文本(文本的字體、顏色和屬性控制),利用設備環(huán)境類CDC實現(xiàn)簡單圖形的繪制(點、線、橢圓、矩形和弧等),各種繪圖工具(畫筆、畫刷)使用。 要求了解CDC編寫的繪圖程序調用GDI ,進而調用設備驅動程序的流程,CDC的幾個派生類及其使用,掌握CDC的文本操作和圖形繪制、常見的繪圖參數設置函數的用法、常見的繪圖工具畫筆和畫刷的使用,熟練掌握調用API或CDC成
2、員函數選擇庫存中的繪圖工具。從MFC示例開始利用類向導,生成一個名為MfcExam的標準MFC多文檔工程類視圖類視圖資源視圖資源視圖文件視圖文件視圖視圖區(qū),也叫客戶區(qū),對應的類是CMfcExamView,所有有關視圖區(qū)的顯示,都是在CMfcExamView中的 OnDraw 函數中完成6.1圖形繪制的基本知識 6.1.1 圖形操作的接口GDI6.1.2 圖形操作有關的CDC類6.1.3 CDC的內容6.1.1 圖形操作的接口GDI 任何圖形程序的輸出,都離不開圖形設備接口GDI(Graphic Device Interface),它是管理Windows應用程序在窗口內的繪圖操作和與此相關的許多
3、其它信息。如圖形設備(打印機、顯示器)的信息、繪圖的坐標系統(tǒng)和映射模式、繪圖工具的當前狀態(tài)(什么樣的畫筆、畫刷、文本的前景色與背景色、文本所使用的字體)。 Windows的GDI繪制的各種圖形(點、線、圓、多邊形、矩形等)是與設備無關的,即在屏幕的窗口內繪圖與在打印機上繪圖是相似的。 GDI是一個可執(zhí)行程序,它接收Windows應用程序的繪圖請求(表現(xiàn)為GDI調用),并將它們傳送給相應的設備驅動程序,再由設備驅動程序驅動相應的硬件設備,如打印機或顯示器輸出。6.1.1續(xù) 應用程序使用GDI可以對三種類型的圖形進行操作:文本操作、矢量圖形操作和光柵圖形操作(圖像操作)。(1)文本操作是以邏輯坐標
4、為單位來計算文本的輸出位置,用戶可以通過各種GDI函數來作出具有各種效果的文本。(2)矢量圖形指的是利用畫點、直線、曲線(折線、貝塞爾曲線等)、多邊形、扇形、矩形等函數所繪制的圖形。(3)光柵圖形操作是指以光柵圖形函數對以位圖形式存儲的數據進行操作,它包括各種位圖和圖標的輸出,其在屏幕上表現(xiàn)為對若干個行和列的像素操作。光柵圖形操作是直接從內存到顯存的拷貝操作,其缺點是需要額外的內存空間,優(yōu)點是操作速度快。6.1.2 圖形操作有關的CDC類 1再論設備描述表 設備描述表是一個用來確定任何設備(如顯示器、打印機)的GDI輸出位置和內容屬性的集合,是Windows系統(tǒng)下的一個保存GDI 內部數據的數
5、據結構,它與特定的顯示設備相關。對于顯示器,設備描述表總是與顯示器上的特定窗口相關。設備描述表中保存了顯示圖形所需要的各種參數值,如顯示顏色、顯示坐標、顯示方式和背景顏色。在Windows下程序員對所有的繪圖功能的調用,都是通過設備描述表來進行的。6.1.2 續(xù) 2. 類CDC CDC是后面所講的其他DC類的基類。CDC基類定義了設備描述表對象, 并且提供在顯示器、打印機或Windows用戶區(qū)上繪圖的方法,它封裝了使用設備環(huán)境的GDI函數。 所有的繪圖操作都是直接或間接運用了CDC的成員函數,這些函數有的進行設備描述表操作,有的是用來畫圖的,還有的函數是用來獲取或設置繪圖屬性,為映像和視點服務
6、的。 在由AppWizard創(chuàng)建的MFC應用程序中,視圖類的OnDraw成員函數是一個處理圖形的關鍵虛函數,它帶有一個指向設備環(huán)境對象的指針pDC,MFC的繪圖成大多都是通過pDC這個指針來加以訪問的。 下面為CDC類的函數的分類分類分類 用途用途 位圖函數位圖函數 操作位圖和像素的函數操作位圖和像素的函數 剪裁函數剪裁函數 定義和操作剪裁設備邊界的函數定義和操作剪裁設備邊界的函數坐標函數坐標函數 在物理設備和邏輯設備之間轉換的函數在物理設備和邏輯設備之間轉換的函數 設備描述表函數設備描述表函數 獲取有關獲取有關DCDC及其屬性信息的函數及其屬性信息的函數繪圖屬性函數繪圖屬性函數 為為DCDC
7、獲取和設置顏色及模式的函數獲取和設置顏色及模式的函數 繪圖工具函數繪圖工具函數 枚舉在枚舉在DCDC中可用的筆和刷子的函數中可用的筆和刷子的函數 橢圓和多邊形函數橢圓和多邊形函數繪制橢圓和多邊形函數繪制橢圓和多邊形函數字體函數字體函數 獲取字體屬性的函數獲取字體屬性的函數線輸出函數線輸出函數在在DCDC上繪制線的函數上繪制線的函數映像函數映像函數創(chuàng)建、獲取和控制原點,擴展窗口和視及為創(chuàng)建、獲取和控制原點,擴展窗口和視及為DCDC獲取和設置映像模式的函數獲取和設置映像模式的函數區(qū)域函數區(qū)域函數 填充區(qū)域和控制區(qū)域顏色的函數填充區(qū)域和控制區(qū)域顏色的函數 簡單繪圖函數簡單繪圖函數提供簡單矩形和圖標的
8、繪制特性函數提供簡單矩形和圖標的繪制特性函數 文本函數文本函數 輸出文本并獲取輸出文本并獲取DCDC當前選中的字體信息的函當前選中的字體信息的函數數 6.1.3 CDC的內容 1派生類CPaintDC(1)CPaintDC是從CDC派生出來的設備描述表類,它常常在窗口的OnPaint函數中使用。查看MFC的源代碼(StudioVC98MFCSRCviewcore.cpp)中的OnPaint函數的實現(xiàn)可以知道,OnPaint函數首先構造一個CPaintDC對象,再調用OnPrepareDC()函數將其準備好,最后以這個準備好的CPaintDC對象指針為參數,來調用OnDraw函數進行各種圖形處理
9、。(2)CPaintDC對象在構造時調用CWnd:BeginPaint函數,并返回DC用于繪圖,在析構時自動調用CWnd:EndPaint函數釋放DC。CPaintDC僅在WM_PAINT消息需要響應時才起作用,通常是在應用程序的OnPaint響應函數中使用。6.1.3 續(xù)1 2派生類CClientDC(管理客戶區(qū)) CClientDC類只能在客戶區(qū)繪圖。所謂客戶區(qū)是指窗口區(qū)域中去掉邊框、標題欄、菜單欄、工具欄、狀態(tài)欄等以外的部分,它是用戶可以操作的區(qū)域。例如打開Word文檔將是將某個.doc文件顯示在其客戶區(qū)域中。在使用CClientDC進行繪圖時,一般要調用GetClientRect函數來
10、獲取客戶區(qū)域的大小。 CClientDC類由CDC派生而來,它使調用和釋放設備環(huán)境的過程自動化。CClientDC對象在構造時調用Windows API函數GetDC, 在析構時調用響應的API函數ReleaseDC,這意味著與CClientDC對象相關的設備環(huán)境是窗口的客戶區(qū)。 CClientDC對象的窗口句柄保存在成員變量m_hWnd,為構造CClientDC,需將CWnd作為參數傳遞給構造函數。6.1.4續(xù)2 3派生類CWindowDC(管理框架窗口) CWindowDC類直接從CDC派生,它使調用和釋放整個窗口(包括客戶區(qū)和非客戶區(qū))的設備環(huán)境過程自動化。CWindowDC對象在構造時
11、調用Windows API函數GetWindowDC, 在析構時調用相應的API函數ReleaseDC,這意味著CWindowtDC對象可訪問CWnd所指向的整個屏幕區(qū)域。 CWindowDC允許在顯示器的任意位置繪圖,坐標原點在整個窗口的左上角。由于使用CWindowDC可以在整個窗口類繪圖,這給了程序員很大的自由度,但使用不當會帶來麻煩。在使用CWindowDC進行繪圖時,一般要調用GetWindowRect函數來獲取整個應用程序窗口區(qū)域的大小。 CWindowDC對象的窗口句柄保存在成員變量m_hWnd,為構造CWindowDC,需將CWnd作為參數傳遞給構造函數。6.2VC的文本操作
12、6.2.1文本輸出函數 6.2.2文本屬性控制 6.2.3文本的字體 6.2.4文本處理實例6.2.1 文本輸出函數 在前面的API編程5.5.2節(jié)中講了一個最簡單的文本輸出函數TextOut(),其實API編程模式和MFC編程模式的最大相似之處在于他們調用的API函數和MFC的成員函數的參數基本上一致,在MFC中出現(xiàn)了很多缺省參數,調用起來更簡單,但他們的核心參數都是一樣的,因此掌握了某一個API函數的用法,在利用MFC編程時,用法基本一致。API編程模式和MFC編程模式的最大不同在于其程序的框架不一樣,可以說,API編程模式的程序框架操作系統(tǒng)已經定義好了,這個框架是最原始的操作系統(tǒng)框架,熟
13、悉該框架比較容易,但框架內部需要自己做的工作還很多;而MFC是一個應用程序框架,是構建在操作系統(tǒng)之上的一個應用程序框架。6.2.1 續(xù)1 文本輸出除了前面講的TextOut()外,常見的還有ExtTextOut()。該函數的原型為:BOOL ExtTextOutint x, int y; /輸出的位置UINT nOptions;/指定矩形的類型LPCRECT lpRect;/輸出的字符的矩形區(qū)域const CString& str;/欲輸出的字符 LPINT lpDxWidths ;/字符間距; 該函數用來在一個給定的矩形lpRect區(qū)域內輸出字符串str,此矩形可以設置為透明的(nO
14、ptions=ETO_OPAQUE)或不透明的,當矩形區(qū)域為不透明時,用當前的背景色填充矩形。6.2.1 續(xù)2 此矩形也可以設置為裁剪(nOptions=ETO_CLIPPED)性質或非裁剪性質,當設置為裁剪性質時,所有在矩形外面的字符串將被裁剪掉。 上述參數中,nOptions主要設置矩形的類型,可以為ETO_OPAQUE和ETO_CLIPPED兩個值的一個或兩個組合;lpDxWidths是一個指向整數數組的指針,此數組中存放以邏輯單位表示的字符間的距離,第n個數代表第n個和n+1個字符之間的距離。該參數為NULL時,則按缺省值處理。6.2.2 文本屬性控制 1 設置文本的背景色 缺省時,在
15、繪制圖形或者輸出文本時,背景顏色是白色??梢允褂肅DC的成員函數SetBkColor函數來設置新的背景顏色,函數原型為: Virtual COLORREF SetBkColor(COLORREF crcolor); 其中參數crcolor用于指定新的背景顏色。例如要將背景顏色設為紅色,可以用以下語句: SetBkColor(RGB(255,0,0);6.2.2續(xù)1 2控制文本的背景色 在設備描述表中有兩項可以影響背景,一個是背景色,另一個是背景模式。背景模式可以為透明的(Transparent)或不透明的(Opaque),缺省為不透明的。當背景模式為不透明時,按背景顏色的值填充字符的空余部分,
16、如果背景模式為透明的,將不用背景顏色填充,保留屏幕上原來的顏色。背景模式可用函數SetBkMode來設置,它設置當前的背景模式并返回原來的背景模式,該函數的原型為: int SetBkMode(int nBkMode); 參數nkbmode指定背景模式,其值可以是OPAQUE或者TRANSPARENT,如果值為OPAQUE,則顯示時背景都改變?yōu)楫斍氨尘邦伾H绻禐門RANSPARENT,則不改變背景顏色,此時,任何SetBkColor函數調用都無效,缺省的背景模式為OPAQUE。 6.2.2續(xù)2 3設置文本的排列方式 在文本顯示時遇到的另一個問題是文本的排列方式,它控制文本和給定點的相對位置
17、。在一個圖形中加字符說明時,常常知道一個字符串的某一個邊界,如左邊界不應超過某個位置,或右邊界不應超過某個位置,或顯示的幾行字符串的中心點對齊等。利用CDC的成員函數SetTextAlign函數就能方便地實現(xiàn)這種控制,其原型為: UINT SetTextAlign (UINT nFlags); 其中,nFlags為文本的對齊方式,其值如下: TA_LEFT 將點同邊界矩形的水平中心對齊 TA_BASELINES將點同所選字體的基線對齊 TA_BOTTOM將點同邊界矩形的底線對齊 6.2.3 文本的字體 字體反映了字符外觀特性,如漢字有宋體、楷體、黑體等,西文也有字體如Arial、Roman等,
18、同一個字符以不同的字體輸出時外觀會不太一樣。VC提供了豐富的字體控制功能,不僅可以使用Windows提供的字體,還可以自己創(chuàng)建字體,這使得Windows下文本輸出具有很大的靈活性,可以隨心所欲,最大限度地滿足用戶對復雜文本的輸出要求。可以這樣說,Word字處理程序所能應用的有關字體的功能,在設備環(huán)境中都能給以支持。 6.2.3續(xù)1 1使用庫存字體 Windows系統(tǒng)本身提供了一些庫存字體,對于大多數應用程序,使用庫存字體即可完成基本的文本輸出功能。要想使用庫存字體,需要使用CDC的成員函數SelectStockObject()來完成,例如: SelectStockObject(OEM_FIXE
19、D_FONT); 該語句把終端字體選入設備環(huán)境,這樣,用TextOut或TextOutEx輸出文本時,將使用DOS命令窗口的字體。其實,每個設備環(huán)境都有一個缺省字體,對于顯示器而言,缺省字體就是SYSTEM_FONT系統(tǒng)字體,如果應用程序不需要執(zhí)行很復雜的文本輸出,使用缺省字體即可。字體名稱字體名稱 說明說明ANSI_FIXED_FONTANSI_FIXED_FONT 基于基于WindowsWindows字符集的固定字寬的字體,通常使用字符集的固定字寬的字體,通常使用CourierCourier字體字體 ANSI_VAR_FONTANSI_VAR_FONT 基于基于WindowsWindows
20、字符集的變寬字體,通常使用字符集的變寬字體,通常使用Ms Sans Ms Sans SerifSerif字體字體 DEVICE_DEFAULT_DEVICE_DEFAULT_FONTFONT特定設備的缺省字體。該字體取決于特定設備的缺省字體。該字體取決于GDIGDI字體的映射程序字體的映射程序如何解釋字體請求,因此對于不同的設備,其字體寬度如何解釋字體請求,因此對于不同的設備,其字體寬度可能不同可能不同 OEM_FIXED_FONTOEM_FIXED_FONTWindowsWindows在在DOSDOS命令提示窗口中使用的字體,又稱終端字命令提示窗口中使用的字體,又稱終端字體,它是一種固定寬度
21、的字體,隨系統(tǒng)的不同而不同體,它是一種固定寬度的字體,隨系統(tǒng)的不同而不同 SYSTEM_FONTSYSTEM_FONT系統(tǒng)字體,是基于系統(tǒng)字體,是基于windowswindows字符集的變寬字體。系統(tǒng)使用字符集的變寬字體。系統(tǒng)使用該字體來顯示窗口的標題、菜單和對話框中的文本。系該字體來顯示窗口的標題、菜單和對話框中的文本。系統(tǒng)字符集總是可用的,而其他字符集則需要安裝后才可統(tǒng)字符集總是可用的,而其他字符集則需要安裝后才可使用使用 Windows庫存字體庫存字體6.2.3續(xù)2 2使用自定義邏輯字體 邏輯字體是用和設備無關的方式來描述一個字體,它使用通用的術語來描述一個字符的宏觀特性(如高度、寬度、
22、旋轉角度、是否有下劃線等),但它不能描述微觀特性,沒有足夠的信息來顯示字體,是從應用的角度描述一個字體,因為在應用時沒有必要把字體的細微結構都描述出來,這會使使用變得很繁瑣,這些細節(jié)由物體字體描述。我們使用時用邏輯字體來描述需要的文本,GDI根據邏輯字體的描述選配最接近的物理字體,由物理字體進行輸出。 MFC提供的CFont類封裝了邏輯字體。創(chuàng)建自定義字體并不是創(chuàng)建一種新的字體,而是創(chuàng)建一種邏輯字體。邏輯字體是一種字體屬性的列表,如高度、寬度、字符集和字樣等。字體映射器按邏輯字體給出的字體特性選擇與之匹配的物理字體 6.2.3續(xù)3 要創(chuàng)建字體,首先要聲明一個CFont對象來表示邏輯字體,然后初
23、始化CFont對象。常見的初始化方法有以下幾種:(1)用CFont的成員函數CreatePointFont直接創(chuàng)建邏輯字體,函數原型為: BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL ); 其中,字體的高度由nPointSize 指定,它以1/10點數為一個單位。例如如該值為100,則字體的高度為10點(1點=0.013837英寸),字體的名稱由lpszFaceName指定。下面為使用該函數的典型代碼:CClientDC dc(this);/聲明客戶區(qū)設備環(huán)境變量dcCFont font;
24、 /聲明邏輯字體變量fontfont.CreatePointFont(120, Arial, &dc);/初始化邏輯字體font 6.2.3續(xù)4CFont* def_font = dc.SelectObject(&font); /將新建的字體font選入設備環(huán)境dc.TextOut(5, 5, Hello, 5); /以所建的字體顯示hellodc.SelectObject(def_font); /恢復舊字體font.DeleteObject(); /刪除所建立的字體(2) 用CFont的成員函數CreateFont直接創(chuàng)建邏輯字體,函數原型為: BOOL CreateFont
25、( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename ); 該函數的參數較多,功能較強,自己查閱MSDN進行分析,我們只需要掌握第一種方法即可。6.2.4 文本處理實例 【例6-2
26、】利用MFC編寫文本處理的應用程序。 1程序功能描述 使用庫存字體和自定義字體,設置文本的前景色、背景色、對齊方式、背景模式,利用TextOut和ExtTextOut函數在屏幕上輸出文本。2利用MFC AppWizard(exe)創(chuàng)建程序步驟(1)運行VC6.0,在File菜單中選擇New命令,在打開的New對話框中選中Projects標簽,在左邊的列表框中選擇MFC AppWizard(exe)選項,在右邊的Project name文本框中輸入工程名TextTest,并選擇合適的路徑?!纠?-2】續(xù)1(2)單擊OK按鈕,啟動AppWizard,在第一步中選擇Single Document單選
27、按鈕。(3)從第2步到第6步使用缺省選項,最后生成工程TextTest。 3編輯視圖類CTextTestView 中的OnDraw函數,實現(xiàn)文本的各種屬性控制及輸出。void CTextTestView:OnDraw(CDC* pDC)CTextTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CFont MyFont; /聲明邏輯字體變量MyFontCFont* pOldFont;CRect rect; /定義矩形變量rect,保存客戶區(qū)域CString caption=TextOut()函數輸出的透明庫存字體OEM_FIXED_FONT!;p
28、DC-SelectStockObject(OEM_FIXED_FONT); /選擇庫存字體GetClientRect(rect);/取得客戶區(qū)的區(qū)域保存到rect中pDC-SetTextAlign(TA_BASELINE);/設置文本的對齊方式為將點與所選字體的基線對齊pDC-SetBkMode(TRANSPARENT);/設置背景模式不透明pDC-SetTextColor(RGB(255,0,0);/設置文本顏色為紅色pDC-SetBkColor(RGB(0,0,255);/設置文本背景顏色為藍色pDC-TextOut(rect.right/6,rect.bottom/6,caption);
29、/輸出文本MyFont.CreatePointFont(140, Arial); /由CreatePointFont函數直接創(chuàng)建一種邏輯字體 pOldFont = pDC-SelectObject(&MyFont); /將新建的字體MyFont選入設備環(huán)境pDC-SetTextColor(:GetSysColor(COLOR_WINDOWTEXT);/將字體顏色設置為Windows系統(tǒng)的文本顏色int currentX=rect.right/6 ,currentY=rect.bottom*4/6;char *caption1=用CreatePointFont創(chuàng)建、ExtTextOut輸
30、出的不透明的Arial字!;pDC-ExtTextOut(currentX,currentY,ETO_OPAQUE, CRect(currentX,currentY-30,currentX+300,currentY+30), caption1,strlen(caption1),NULL);/在指定的矩形內不透明顯示文本 pDC-SelectObject(pOldFont);/恢復系統(tǒng)先前的字體6.3CDC的繪圖操作 6.3.1 畫點與畫線函數操作 6.3.2 繪制封閉圖形 6.3.3 設置繪圖參數6.3.4 繪圖模式 6.3.5 繪圖操作實例6.3.1 畫點與畫線函數操作1畫點 CDC的成員函
31、數SetPixel用來在指定位置上繪制一個特定的像素點,其原型為:COLORREF SetPixel( POINT point, COLORREF crColor ); 其中參數point指定所繪制的點,crColor指定畫點所用的顏色。倘若要在屏幕的(100,100)處畫一個紅色點,則代碼為:pDC- SetPixel(CPoint(100,100),RGB(255,0,0);2畫折線 PolyLine()函數用于畫一條折線,它的原型如下所示。 BOOL Polyline( LPPOINT lpPoints, int nCount ); 其中l(wèi)pPoints是指向折線頂點數組的指針,而cCo
32、unt則指定折線頂點數組中的頂點數目。 6.3.1 續(xù)1 3畫弧線 使用CDC的成員函數Arc和ArcTo,可以用缺省的筆畫一段不填充的橢圓弧。Arc函數的原型如下: BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 這兩個函數畫弧成功返回非0,否則返回0,函數中各參數的含義如下:參數x1與y1為包圍弧的矩形的左上角x、y坐標;x2與y2為包圍弧的矩形的右下角x、y坐標;x3與y3為
33、弧的起點x、y坐標;x與y為弧的終點x、y坐標。 參數lpRect表示圍繞弧的矩形,它可以是LPRECT 或CRect對象,ptStart表示弧的起點的CPoint 或POINT對象,該點不必精確地位于弧上;PtEnd表示弧的終點的CPoint 或POINT對象,該點不必精確地位于弧上。6.3.2 繪制封閉圖形 Windows提供了Rectangle、Ellipse、RoundRect、Chord、Pie等五個函數用來繪制并填充圖形。1畫矩形BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPCRECT lpRe
34、ct ); 此函數成功調用后返回非0值,否則返回0。其中參數(x1,y1)為指定矩形的左上角邏輯x與y坐標;(x2,y2)為指定矩形右下角的邏輯x與y坐標。參數LpRect為一個矩形結構的指針,用它來表示矩形的四個角。6.3.2 續(xù)12畫橢圓或圓 使用CDC的成員函數Ellipse,可以使用當前筆繪制一個用當前畫刷填充的橢圓或圓。其函數原型如下:BOOL Ellipse(int x1, int y1, int x2, int y2 );BOOL Ellipse( LPCRECT lpRect ); 這兩個函數畫橢圓成功后返回非0值,否則返回0。所畫橢圓高度為y2-y1,寬度為x2-x1。在該函
35、數中,橢圓是由其外接矩形來確定的。外接矩形的中心與橢圓中心重合,矩形的長和寬和橢圓的長短軸相等。函數中的參數與畫矩形的相仿,分別表示橢圓外接矩形的左上角和右下角坐標。3畫圓角矩形BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 ); 該函數用于繪制一個圓角矩形,并用當前的畫刷來填充該圓角矩形的內部區(qū)域。其中參數(x1,y1)為指定矩形的左上角位置x與y坐標;(x2,y2)為指定矩形右下角位置x與y坐標,(x3,y3)用于定義矩形四個角上的邊角內切橢圓的寬度和高度,值越大,圓角矩形的角就越明顯。如果x3=x2-x1,并且
36、y3=y2-y1,則所繪制的圓角矩形變?yōu)橐粋€橢圓。6.3.2 續(xù)26.3.2 續(xù)34 畫餅圖扇形餅圖是一條弧和從弧的兩個端點到中心的連線組成的圖形。CDC的成員函數Pie可用于畫餅圖,函數原型如下:BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 該函數的參數與Arc函數的參數的含義相仿,只不過Pie函數畫的是封閉圖形,Arc畫的是非封閉圖形。各參數參見6.3.1節(jié)介紹。5 畫弓形弓形
37、圖是一條橢圓弧和連接該弧線兩個端點的弦,并用當前的畫刷來填充其內部區(qū)域的封閉圖形。Chord原型如下:BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 ); 該函數參數與Pie函數參數的含義相仿。 6.3.2 續(xù)46.3.3 設置繪圖參數 繪圖參數主要包括文本的前景色、文本的背景色、背景模式、繪圖模式、位圖伸展模式等,恰當地設置繪圖參數,可以達到各種繪圖效果。 繪圖參數中的文本前景色靠CDC:SetTextColor()來控制,文本的背景色靠CDC:SetBkColor()來控制,背景模式又稱填
38、充模式,指的是在使用畫筆繪制虛線、點劃線或者使用畫刷來填充封閉區(qū)域時,點和畫刷及畫刷陰影線之間空隙的著色方式。該功能的實現(xiàn)靠CDC:SetBkModer()來完成,位圖伸展模式被CDC的成員函數StretchBlt()使用,它決定進行位圖伸展時(目標位圖的大小與顯示區(qū)域的大小不同時就要伸展)如何處理位圖數據與目標中原有數據的關系。下面講繪圖參數設置中的繪圖模式的設置及其功能。6.3.4 繪圖模式 畫筆和畫刷對點線的繪制和圖形的填充起著很重要作用,除此之外,還有設備描述表中的繪圖模式(又稱光柵操作模式)。例如當繪制一條線段時,該線段的顏色不僅取決于畫筆的顏色,而且也取決于該線段所在顯示區(qū)域的顏色
39、。 當Windows使用畫筆畫線時,它實際上是在畫筆像素和目標位置處原像素之間執(zhí)行一種按位布爾運算,稱為“光柵操作”(Raster Operation),簡記為“ROP”。由于畫線操作只涉及兩種像素(畫筆像素和目標像素),所以這種布爾運算又稱為“二元光柵操作”(ROP2)。Windows定義了16種ROP2碼,用來表示畫筆像素和目標像素各種不同的組合方式??梢哉{用CDC的成員函數SetROP2改變繪圖模式,函數原型為:int SetROP2(int nDrawMode); 繪圖模式繪圖模式說明說明布爾操作(布爾操作(P為畫筆像為畫筆像素素D為目標像素)為目標像素)R2_BLACK像素最終顏色為
40、黑色0R2_WHITE像素最終顏色為白色1R2_NOP像素顏色沒有變化,還是原先目標像素顏色DR2_NOT像素最終顏色為原來顏色的反色DR2_COPYPEN(缺省缺省)像素最終顏色為當前畫筆的顏色PR2_NOTCOPYPEN像素最終顏色為當前畫筆顏色的反色PR2_MERGEPEN像素最終顏色為當前畫筆顏色P和原來顏色D的邏輯或P|DR2_MERGEPENNOT像素最終顏色為當前畫筆顏色P和原來顏色反色D的邏輯或P|DR2_MASKPEN像素最終顏色為當前畫筆顏色P和原來顏色D的邏輯與P&DR2_MASKPENNOT像素最終顏色為當前畫筆顏色P和原來顏色反色D的邏輯與P&DR2_
41、MERGENOTPEN像素最終顏色為當前畫筆顏色P的反色和原來顏色的邏輯或P|DR2_MASKNOTPEN像素最終顏色為當前畫筆顏色的反色和原來顏色的邏輯與P&DR2_NOTMERGEPEN像素最終顏色為R2_MERGEPEN結果的反色(P|D)R2_NOTMASKPEN像素最終顏色為R2_MASKPEN結果的反色(P&D)R2_XORPEN像素最終顏色為當前畫筆顏色和原來顏色的異或結果PDR2_NOTXORPEN像素最終顏色為R2_XORPEN結果的反色(PD)6.3.4續(xù)1注意:(1) 在畫線時,如果繪圖模式為R2_NOT,則畫出的線的顏色為原先屏幕顏色的反色。這樣畫的線均
42、可見,而且第二次畫同一條線時,將自動擦除該線并恢復為當前顯示顏色。(2) R2_NOP繪圖模式等效于同時選擇NULL畫筆和NULL畫刷。(3) 在R2_XORPEN的操作模式下,用相同的參數兩次調用某一條繪圖命令時(包括文字輸出函數),其結果仍然保留原樣,利用這種方式,我們可以實現(xiàn)圖形動畫效果。(4) 在畫虛線時,用于填充線間的空白顏色取決于當前背景模式和背景顏色。(5) 在R2_NOTXORPEN的操作模式下,其功能有二,第一,將同一直線繪制兩次,將刪除該直線;第二,無論背景是何顏色,第一次繪制的直線總是可見的。6.3.5 繪圖操作實例 【例6-3】一個演示繪圖模式與畫線的應用程序。1程序功
43、能描述 利用繪圖模式實現(xiàn)“橡皮條”功能的直線繪制。一般的繪圖軟件(如AutoCAD),在畫直線時的操作方法是:當按鼠標左鍵時,準備繪制直線,當在屏幕移動鼠標時,在屏幕上畫一條直線,該直線開始于原先按下鼠標左鍵的位置,終止于當前鼠標移動到的位置。隨著鼠標的移動,該直線也在移動,但直線的起始點不動,類似于一個橡皮筋固定在一端,而在拉動它的另一端。2利用MFC AppWizard(exe)創(chuàng)建程序步驟(1)生成應用程序框架 利用應用程序向導MFC AppWizard(exe)創(chuàng)建一個單文檔的應用程序框架,該工程的名稱為MyDraw,向導的每個步驟都使用缺省的?!纠?-3】續(xù)1(2)在視圖類CMyDr
44、aw添加數據成員在工程MyDraw的工作區(qū)中,選擇“ClassView”選項卡,在類名列表窗口中選擇視圖類“CMyDrawView”,然后單擊鼠標右鍵,在彈出的快捷菜單中選擇“Add Member Variable”命令,則彈出圖6.2所示的對話框。在“Variable Type”編輯框中輸入bool,在“Variable Name”編輯框中輸入m_IsDraw,選擇Access(訪問控制屬性)為Private(私有)。最后按“OK”按鈕,則在視圖類CMyDrawView中添加了一個bool型的私有成員變量m_IsDraw,用于標記是否開始繪制直線,當該值為真時,代表開始畫直線,為假時,代表停
45、止畫直線。 另外,為了確定所畫線的起始點和終止點,需要在視圖類中添加兩個CPoint型的成員變量m_StartPoint和m_EndPoint,前者存放直線的起始點,后者存放直線的終止點,添加的方法同上。圖6.2【例6-3】續(xù)2(3)對成員變量m_IsDraw進行初始化 在視圖類CMyDrawView的構造函數中添加如下的代碼可以實現(xiàn)對數據成員的初始化。CMyDrawView:CMyDrawView() m_IsDraw=false; /開始不繪制直線(4)添加鼠標左鍵按下消息的映射函數選擇View|ClassWizard命令,彈出MFC ClassWizard窗體,在Class name 中
46、選擇CMyDrawView,在Messages中選擇WM_LBUTTONDOWN,然后單擊“Add Function”按鈕,這樣就為視圖類添加了WM_LBUTTONDOWN的消息處理函數OnLButtonDown, 如圖6.3所示。圖6.3【例6-3】續(xù)3 最后,單擊“Edit Code”按鈕,光標自動定位到OnLButtonDown 實現(xiàn)處,在該消息映射函數中添加后的代碼如下:void CMyDrawView:OnLButtonDown(UINT nFlags, CPoint point) m_IsDraw=true; /開始繪制直線m_StartPoint=m_EndPoint=point
47、; /開始畫線時起始點與終止點重合CView:OnLButtonDown(nFlags, point); 【例6-3】續(xù)4(5)添加鼠標移動的消息映射函數 與上一步類似,利用ClassWizard為視圖類CMyDrawView添加擊鍵消息WM_MOUSEMOVE的消息映射函數OnMouseMove(),并在該函數中添加代碼,以用于移動屏幕上的圖形。void CMyDrawView:OnMouseMove(UINT nFlags, CPoint point) CClientDC dc(this); /構造一個客戶設備環(huán)境dcif(m_IsDraw) dc.MoveTo(m_StartPoint)
48、; /移動到起始點 dc.SetROP2(R2_NOTXORPEN);/設置繪圖模式為R2_NOTXORPEN dc.LineTo(m_EndPoint); /從點m_StartPoint畫線到點m_EndPoint,即刪除原舊線 dc.MoveTo(m_StartPoint); /移動到起始點 dc.LineTo(point);/從點 m_StartPoint畫線到當前的鼠標位置point m_EndPoint=point; /改變終止點為當前的鼠標位置pointCView:OnMouseMove(nFlags, point);【例6-3】續(xù)4(6)添加鼠標左鍵彈起的消息映射函數 與上一步類
49、似,利用ClassWizard為視圖類CMyDrawView添加擊鍵消息WM_LBUTTONUP的消息映射函數OnLButtonUp(),并在該函數中添加如下代碼,以用于停止繪圖: void CMyDrawView:OnLButtonUp(UINT nFlags, CPoint point) m_IsDraw=false; /停止繪制直線CView:OnLButtonUp(nFlags, point); 6.4Windows繪圖工具 6.4.1 繪圖工具的劃分6.4.2 使用畫筆 6.4.3 使用畫刷6.4.4 使用庫存工具概要 VC繪圖需要兩個要素:設備描述表和基本繪圖工具。設備描述表是由C
50、DC類及其派生類來描述,它是一個畫圖的畫布,提供繪圖的場地和環(huán)境。畫布一般是窗口的客戶區(qū),每個窗口CWnd對象都提供一個設備環(huán)境,在該環(huán)境中有一套默認的基本繪圖工具。上一節(jié)講的文本操作中,可以更改文字的字體,字體就是一種繪圖工具。當設備環(huán)境所提供的默認的繪圖工具不能滿足我們的需求時,就需要更改默認繪圖工具,達到繪制豐富多彩圖形的目的。 6.4.1 繪圖工具的劃分 繪圖工具,又稱繪圖對象,使用他們可以在Windows設備環(huán)境中繪制具有各種效果的圖形。如果把設備描述表比作畫布,程序員比作畫家的話,那么繪圖工具就是畫家手中的畫筆、畫刷、調色板等。任何一個畫家,不論他的技藝有多么高超(類似于程序員要掌
51、握繪圖原理),在沒有任何繪圖工具的情況下,都無法在畫布上畫圖。 Windows的繪圖工具包括畫筆、畫刷、字體、位圖、調色板和區(qū)域。在MFC中這些繪圖工具被封裝到相應的類中。這些繪圖工具中,字體在文本操作中已講,該節(jié)中主要講解其它的幾類繪圖工具,其中沒有講調色板和位圖,自己查閱相關資料進行學習。 6.4.2 使用畫筆 畫筆是最簡單的一種繪圖工具,同時也是最重要的一種繪圖對象。在現(xiàn)實世界中,可以用不同的筆產生不同的線。這正如繪圖用的彩筆、不同顏色筆產生不同顏色的線。Windows也是利用這種面向對象的描述事物的方法,把筆作為一個對象,和現(xiàn)實世界一樣,不同的筆產生不同的線。 1 畫筆類CpenCPe
52、n對象封裝了Windows GDI筆,并提供與CPen對象一起工作的幾種方法。6.4.2續(xù)1 2畫筆工具的操作步驟(1)聲明CPen對象。(2)初始化畫筆。通過調用CreatePen成員函數可以初始化筆,該函數的原型為:BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );(3)將新建的畫筆對象選進設備場景中,同時保存原畫筆對象的指針:pOldPen=pDC-SelectObject(&pen);(4)調用繪圖函數生成圖形。(5)選擇設備場景的原有筆對象。6.4.2續(xù)2 3畫筆工具的操作實例【例6-4】一個演示畫筆的
53、例子。首先利用MFC AppWizard(exe)創(chuàng)建一個新工程,工程的名字為PenTest,除了應用程序的類型選為單文檔模式外,向導的每個操作步驟都采用缺省的。(1) 編輯視圖類CPenTestView的虛函數OnDraw,實現(xiàn)畫筆工具的操作演示。(2)程序運行結果如圖6.4所示void CPenTestView:OnDraw(CDC* pDC)CPenTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);_int8 i; CPen*pOldPen; for(i=0;iSelectObject( &NewPen );pDC-MoveTo(6
54、0,60+i*30);pDC-LineTo(200,60+i*30); /用新創(chuàng)建的筆畫直線pDC-SelectObject( pOldPen ); /恢復設備描述表中原有筆elseAfxMessageBox(不能創(chuàng)建筆!); /給出錯誤提示return ;pDC-TextOut(60,60+i*30,不同風格的筆);/設置顏色表structtagColor int r,g,b; color6= 255,0,0,0,255,0,0,0,255,255,255,0,255,0,255,0,255,255 ;for(i=5;i=0;i-) /用不同顏色筆畫圓 CPen NewPen; /聲名一個筆
55、對象if( NewPen.CreatePen( PS_SOLID, 3, RGB(colori.r,colori.g,colori.b) ) ) pOldPen = pDC-SelectObject( &NewPen );/用新創(chuàng)建的筆畫圓pDC-Ellipse( 400-(i+1)*15, 150-(i+1)*15, 400+(i+1)*15,150+(i+1)*15);pDC-SelectObject( pOldPen ); /恢復設備描述表中的原有的筆else AfxMessageBox(不能創(chuàng)建筆!);return ;pDC-TextOut(400-(i+4)*15,150+(
56、i+9)*15,不同顏色的筆); 畫筆的各種效果演示6.4.3 使用畫刷畫筆對象是用來繪制圖形邊界的,而畫刷則是給圖形內部著色的。大多數CDC的繪圖函數都要同時使用畫筆和畫刷使用畫筆來來繪制各種圖形的邊界,使用畫刷來填充圖形的內部。1常用的兩類畫刷(1)純色畫刷 又稱實畫刷,事實上它是一個定義了8像素8像素的含有64個相同顏色的像素。在繪制時,Windows將多個這樣的純色位圖平鋪來填充封閉圖形的內部。 創(chuàng)建純色畫刷首先創(chuàng)建一個非初始化的CBrush對象,然后調用CBrush:CreateSolidBrush()函數來初始化純色畫刷。6.4.3續(xù)1(2)陰影畫刷 陰影畫刷是用某種顏色的陰影線在
57、封閉圖形內填充。它也是一個定義了8像素8像素的含有64個像素單位位圖,該位圖就是一個陰影。在繪制時,Windows將多個這樣含有陰影的位圖平鋪來填充封閉圖形內部。 創(chuàng)建陰影畫刷首先創(chuàng)建一個非初始化的CBrush對象,然后調用CBrush: CreateHatchBrush()函數來初始化陰影畫刷。 當使用陰影繪圖時,Windows使用默認的背景顏色將陰影線段之間的空間填滿。但是,若使用CDC:SetBkColor()函數改變了當前設備描述表的背景顏色,或者通過使用CDC:SetBkMode()函數從OPAQUE到TRANSPARENT改變背景模式,以便關閉背景填充時,這些默認值就被相應地改變了
58、。6.4.3續(xù)22畫刷類CBrush CBrush對象封裝了Windows GDI刷子,并提供與CBrush對象一起工作的一些函數,如表6.6所示。3畫刷工具的使用步驟(1)生成CBrush的實例。刷子以多種樣式和顏色出現(xiàn)在CBrush:CBrush(): CBrush( ); CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); 表6.6畫刷類CBrush的成員函數6.4.3續(xù)3上述函數的參數crColor指定刷子顏色;nIndex參數指定刷子圖案,其值如表6.7所示。(2)調用相應的成員函數初始化刷子。(3)
59、將所創(chuàng)建的畫刷選入設備環(huán)境,同時保存原畫刷對象的指針。(4)調用繪圖函數生成圖形。(5)恢復原先設備環(huán)境中的畫刷。 4畫刷工具的操作實例【例6-5】一個演示各種畫刷的例子。首先利用MFC AppWizard(exe)創(chuàng)建一個新工程,工程的名字為BrushTest,除了應用程序的類型選為單文檔模式外,向導的每個操作步驟都采用缺省的。(1) 編輯視圖類CBrushTestView的虛函數OnDraw,實現(xiàn)畫刷工具的操作演示。(2)程序運行結果如圖6.5所示。void CBrushTestView:OnDraw(CDC* pDC)CBrushTestDoc* pDoc = GetDocument()
60、;ASSERT_VALID(pDoc);_int8 i;CBrush* pNewBrush,*pOldBrush; /定義一個新畫刷和舊畫刷的指針變量定義一個新畫刷和舊畫刷的指針變量/設置純色畫刷的顏色表設置純色畫刷的顏色表structtagColor int r,g,b; color7=255,0,0,0,255,0,0,0,255,255,255,0,255,0,255,0,255,255;for(i=0;iCreateSolidBrush(RGB(colori.r, colori.g, colori.b)pOldBrush = pDC-SelectObject( pNewBrush ); /將新建的新畫刷選入設備環(huán)境將新建的新畫刷選入設備環(huán)境pDC-Rectangle(40
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024高中語文第二單元置身詩境緣景明情自主賞析夢游天姥吟留別學案新人教版選修中國古代詩歌散文欣賞
- 2024高考化學一輪復習第十一章有機化學基礎第三講烴的含氧衍生物規(guī)范演練含解析新人教版
- 2024高考地理一輪復習第七章區(qū)域產業(yè)活動第24講工業(yè)區(qū)位因素與工業(yè)地域聯(lián)系教案湘教版
- DB42-T 2341-2024 綜合管廊頂管工程技術規(guī)程
- 二零二五年版環(huán)保建材板材買賣合同范本3篇
- 2024年海南經貿職業(yè)技術學院高職單招語文歷年參考題庫含答案解析
- 2024年海南體育職業(yè)技術學院高職單招語文歷年參考題庫含答案解析
- 危險化學品典型案例課件
- 2024年河南對外經濟貿易職業(yè)學院高職單招職業(yè)適應性測試歷年參考題庫含答案解析
- 二零二五年城市夜景照明設施改造與維護服務合同范本3篇
- 江蘇省蘇州市昆山、太倉、常熟、張家港四市2024-2025學年九年級上學期期末陽光測試道法卷(含答案)
- 溫濕度記錄管理制度模版(3篇)
- wps計算機二級選擇押題單選題100道及答案
- 2025的委托拍賣合同范本
- 管理制度醫(yī)療器械質量管理制度
- 顱腦損傷的高壓氧治療
- 公司章程模板五篇
- 機械工程師招聘筆試題及解答
- 2023年基礎會計學課后習題及參考答案
- GB/T 44265-2024電力儲能電站鈉離子電池技術規(guī)范
- 醫(yī)療機構病歷管理規(guī)定(2024 年版)
評論
0/150
提交評論