




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第三講 MFC繪圖基礎主講:呂駿 Windows是一個圖形操作系統(tǒng),大多數是一個圖形操作系統(tǒng),大多數應用程序都需要在客戶區(qū)繪制一些圖形,如繪應用程序都需要在客戶區(qū)繪制一些圖形,如繪制文本、幾何圖形、位圖和光標等。制文本、幾何圖形、位圖和光標等。n Windows提供了一個稱為圖形設備接口提供了一個稱為圖形設備接口GDI(Graphics Device Interface)的抽象接的抽象接口???。GDI作為作為Windows的重要組成部分,它負責的重要組成部分,它負責管理用戶繪圖操作時功能的轉換。用戶通過調用管理用戶繪圖操作時功能的轉換。用戶通過調用GDI函數與設備打交道,函數與設備打交道,GD
2、I通過不同設備提供通過不同設備提供的驅動程序將繪圖語句轉換為對應的繪圖指令,的驅動程序將繪圖語句轉換為對應的繪圖指令,避免了直接對硬件進行操作,從而實現所謂的避免了直接對硬件進行操作,從而實現所謂的設設備無關性備無關性。所謂所謂設備無關性設備無關性,是指操作系統(tǒng)屏蔽,是指操作系統(tǒng)屏蔽了硬件設備的差異,使用戶編程時一般無需考慮了硬件設備的差異,使用戶編程時一般無需考慮設備的類型,如不同種類的顯示器或打印機。設備的類型,如不同種類的顯示器或打印機。 Windows繪圖過程和設備無關性的實現繪圖過程和設備無關性的實現: GDI處于設備驅動程序的上一層,當程序調用繪圖函數時,GDI將繪圖命令傳送給當前
3、設備的驅動程序,以調用驅動程序提供的接口函數。驅動程序的接口函數將Windows繪圖命令轉化為設備能夠執(zhí)行的輸出命令,實現圖形的繪制。不同設備具有不同的驅動程序,設備驅動程序是設備相關的。設備環(huán)境設備環(huán)境DC(Device Context)n為了實現設備無關性,應用程序的輸出不直接面為了實現設備無關性,應用程序的輸出不直接面向顯示器等物理設備,而是面向一個稱之為向顯示器等物理設備,而是面向一個稱之為設備設備環(huán)境環(huán)境DC(Device Context)的虛擬邏輯設備。的虛擬邏輯設備。n設備環(huán)境也稱設備環(huán)境也稱設備描述表設備描述表或或設備上下文設備上下文,它是由,它是由Windows管理的一個數據
4、結構,它保存了繪圖操管理的一個數據結構,它保存了繪圖操作中一些共同需要設置的信息,如當前的畫筆、作中一些共同需要設置的信息,如當前的畫筆、畫刷、字體和位圖等圖形對象及其屬性,以及顏畫刷、字體和位圖等圖形對象及其屬性,以及顏色和背景等影響圖形輸出的繪圖模式。色和背景等影響圖形輸出的繪圖模式。n形象地說,一個設備環(huán)境提供了一張形象地說,一個設備環(huán)境提供了一張畫布畫布和一些和一些繪畫的繪畫的工具工具,我們可以使用不同顏色的工具在上,我們可以使用不同顏色的工具在上面繪制點、線、圓和文本。面繪制點、線、圓和文本。n在在Windows中不使用中不使用DC無法進行輸出,在使用無法進行輸出,在使用任何任何GD
5、I繪圖函數之前,必須建立一個設備環(huán)境繪圖函數之前,必須建立一個設備環(huán)境。 獲取獲取設備環(huán)境設備環(huán)境DC的方法:的方法: n在程序中不能直接存取在程序中不能直接存取DC數據結構,只能通過系數據結構,只能通過系統(tǒng)提供的一系列函數或使用設備環(huán)境的句柄統(tǒng)提供的一系列函數或使用設備環(huán)境的句柄HDC來間接地獲取或設置設備環(huán)境結構中的各項屬性來間接地獲取或設置設備環(huán)境結構中的各項屬性,如顯示器高度和寬度、支持的顏色數及分辨率,如顯示器高度和寬度、支持的顏色數及分辨率等。等。n如果采用如果采用SDK方法編程,獲取方法編程,獲取DC的方法有兩種:的方法有兩種:在在WM_PAINT消息處理函數中通過調用消息處理函
6、數中通過調用API函數函數BeginPaint()獲取設備環(huán)境,在消息處理函數返獲取設備環(huán)境,在消息處理函數返回前調用回前調用API函數函數EndPaint()釋放設備環(huán)境。在釋放設備環(huán)境。在其他函數中通過調用其他函數中通過調用API函數函數GetDC()獲取設備獲取設備環(huán)境,調用環(huán)境,調用API函數函數ReleaseDC()釋放設備環(huán)境釋放設備環(huán)境。獲取設備描述表:方法一獲取設備描述表:方法一n該方法適合于處理非該方法適合于處理非WM_PAINT消息消息n用用GetDC獲取設備描述表句柄獲取設備描述表句柄n用用ReleaseDC釋放設備描述表句柄釋放設備描述表句柄n這種獲取設備描述表的一般方
7、式如下這種獲取設備描述表的一般方式如下hdc = GetDC(hwnd) ;ReleaseDC(hwnd, hdc) ;9WM_PAINT消息消息n什么時候向窗口過程發(fā)送什么時候向窗口過程發(fā)送WM_PAINT消消息(窗口發(fā)生重繪)息(窗口發(fā)生重繪) “無效無效”的時候的時候n調用調用UpdateWindow函數刷新窗口函數刷新窗口n窗口的全部或者部分失效的時候窗口的全部或者部分失效的時候n窗口從無到有窗口從無到有n手動刷新窗口手動刷新窗口n調用調用InvalidateRect函數函數計算機科學與技術學院 張淼10獲取設備描述表:方法二獲取設備描述表:方法二n該方法只適合于處理該方法只適合于處理
8、WM_PAINT消息消息n用用BeginPaint“使無效窗口生效使無效窗口生效”并并“返回返回設備描述表句柄設備描述表句柄”n用用EndPaint釋放設備描述表句柄釋放設備描述表句柄n一般處理一般處理WM_PAINT的形式如下:的形式如下:Case WM_PAINT;hdc = BeginPaint(hwnd, &ps) ;EndPaint(hwnd, &ps) ;return 0 ;n如果采用如果采用MFC方法編程,方法編程,MFC提供了不同類型的提供了不同類型的DC類,每一個類都封裝了類,每一個類都封裝了DC句柄,并且它們的構句柄,并且它們的構造函數自動調用獲取造函數自動
9、調用獲取DC的的API函數,析構函數自函數,析構函數自動調用釋放動調用釋放DC的的API函數。因此,在程序中通過函數。因此,在程序中通過聲明一個聲明一個MFC設備環(huán)境類的對象就自動獲取了一設備環(huán)境類的對象就自動獲取了一個個DC,而當該對象被銷毀時就自動釋放了獲取的而當該對象被銷毀時就自動釋放了獲取的DC。MFC AppWizard應用程序向導創(chuàng)建的應用程序向導創(chuàng)建的OnDraw()函數自動支持所獲取的函數自動支持所獲取的DC。nMFC的的DC類包括類包括CDC、CPaintDC、CClientDC、CWindowDC等,其中等,其中CDC類是類是MFC設備環(huán)境設備環(huán)境類的基類,其它的類的基類,
10、其它的MFC設備環(huán)境類都是設備環(huán)境類都是CDC的派的派生類。生類。 nCDC類既作為其它類既作為其它MFC設備環(huán)境類的基類,又可設備環(huán)境類的基類,又可以作為一個一般的設備環(huán)境類使用。利用它可以以作為一個一般的設備環(huán)境類使用。利用它可以訪問設備屬性和設置繪圖屬性。訪問設備屬性和設置繪圖屬性。CDC類對類對GDI的的所有繪圖函數進行了封裝。所有繪圖函數進行了封裝。nCPaintDC類是類是OnPaint()函數使用的設備環(huán)境類函數使用的設備環(huán)境類,它代表一個窗口的繪圖畫面。如果添加,它代表一個窗口的繪圖畫面。如果添加WM_PAINT消息處理函數消息處理函數OnPaint(),就需要使就需要使用用C
11、PaintDC類來定義一個設備環(huán)境對象。類來定義一個設備環(huán)境對象。 nCClientDC類代表了客戶區(qū)設備環(huán)境。當在客戶類代表了客戶區(qū)設備環(huán)境。當在客戶區(qū)實時繪圖時,需要利用區(qū)實時繪圖時,需要利用CClientDC類定義一個類定義一個客戶區(qū)設備環(huán)境。客戶區(qū)設備環(huán)境。nCWindowDC類代表了整個程序窗口設備環(huán)境,類代表了整個程序窗口設備環(huán)境,可以在整個窗口區(qū)域繪圖??梢栽谡麄€窗口區(qū)域繪圖。 CClientDC、CPaintDC和和CWindowDC的區(qū)別的區(qū)別n當窗口的某個區(qū)域需要重繪時激發(fā)窗口重繪消息當窗口的某個區(qū)域需要重繪時激發(fā)窗口重繪消息WM_PAINT,相,相應消息處理函數應消息處理
12、函數CWnd:OnPaint將被調用。將被調用。CPaintDC一般只用一般只用于于OnPaint函數中,在處理完窗口重繪后,函數中,在處理完窗口重繪后, CPaintDC對象的析對象的析構函數把構函數把WM_PAINT消息從消息隊列中清除,避免不斷地重繪操消息從消息隊列中清除,避免不斷地重繪操作。坐標原點作。坐標原點(0,0)是客戶區(qū)的左上角。是客戶區(qū)的左上角。nCClientDC用于特定窗口客戶區(qū)(窗口中除邊框、標題欄、菜單用于特定窗口客戶區(qū)(窗口中除邊框、標題欄、菜單欄、狀態(tài)欄外的中間部分)的輸出,其構造函數中包含了欄、狀態(tài)欄外的中間部分)的輸出,其構造函數中包含了GetDC,析構函數中
13、包含了析構函數中包含了ReleaseDC,不需要顯式釋放,不需要顯式釋放DC資源。一般用資源。一般用于響應非重繪消息(如鍵盤和鼠標消息)的繪圖操作。坐標原點于響應非重繪消息(如鍵盤和鼠標消息)的繪圖操作。坐標原點(0,0)是客戶區(qū)的左上角。是客戶區(qū)的左上角。nCWindowDC在整個應用程序窗口上畫圖,而在整個應用程序窗口上畫圖,而CClientDC和和CPaintDC只能在客戶區(qū)繪制圖形;除非要自己繪制窗口邊框和按只能在客戶區(qū)繪制圖形;除非要自己繪制窗口邊框和按鈕,否則一般不用它。坐標原點鈕,否則一般不用它。坐標原點(0,0)是屏幕的左上角。是屏幕的左上角。13MFC中獲取中獲取DC的方法的
14、方法n在如在如OnDraw等函數中傳遞一個指向等函數中傳遞一個指向CDC 對象的指針對象的指針n如如OnDraw(CDC* pDC);n使用構造函數構建對象使用構造函數構建對象n一般不構造一般不構造CDC對象對象n在在CWnd類的類的OnPaint函數中,定義函數中,定義CPaintDC對象對象nCPaintDC dc(this);n在在CWnd類的其它函數中,定義類的其它函數中,定義CClientDC和和CWindowDC的對象的對象nCClientDC dc(this);nCWindowDC dc(this);OnDraw與與OnPaint的區(qū)別的區(qū)別nOnDraw是是CView類的成員函
15、數,不響應消息;類的成員函數,不響應消息;OnPaint是是CWnd類的成員函數,相應類的成員函數,相應WM_PAINT消息。消息。nCView默認調用的默認調用的OnPaint函數如下函數如下void CView:OnPaint() CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); /調用了調用了OnDrawn可見可見OnPaint函數也調用了函數也調用了CView:OnDraw函數。因而一函數。因而一般在般在OnDraw函數內添加繪圖代碼,完成繪圖任務函數內添加繪圖代碼,完成繪圖任務15 GDI坐標系和映射模式坐標系和映射模
16、式 lWindows坐標系分為邏輯坐標系和設備坐標系兩坐標系分為邏輯坐標系和設備坐標系兩種,種,GDI支持這兩種坐標系。一般而言,支持這兩種坐標系。一般而言,GDI的的文本和圖形輸出函數使用邏輯坐標,而在客戶區(qū)文本和圖形輸出函數使用邏輯坐標,而在客戶區(qū)移動或按下鼠標的鼠標位置是采用設備坐標。移動或按下鼠標的鼠標位置是采用設備坐標。 l邏輯坐標系是面向邏輯坐標系是面向DC的坐標系,這種坐標不考慮的坐標系,這種坐標不考慮具體的設備類型,在繪圖時,具體的設備類型,在繪圖時,Windows會根據當會根據當前設置的映射模式將邏輯坐標轉換為設備坐標。前設置的映射模式將邏輯坐標轉換為設備坐標。l設備坐標系是
17、面向物理設備的坐標系,這種坐標設備坐標系是面向物理設備的坐標系,這種坐標以像素或設備所能表示的最小長度單位為單位,以像素或設備所能表示的最小長度單位為單位,X軸方向向右,軸方向向右,Y軸方向向下。設備坐標系的原點位軸方向向下。設備坐標系的原點位置置(0, 0)不限定在設備顯示區(qū)域的左上角。不限定在設備顯示區(qū)域的左上角。設備坐標系統(tǒng)設備坐標系統(tǒng)n設備坐標系統(tǒng)設備坐標系統(tǒng)nx軸自左至右,軸自左至右,y軸從上到下,坐標原點在屏軸從上到下,坐標原點在屏幕左上角幕左上角0,0XYO17設備坐標系設備坐標系分為分為屏幕坐標系、窗口坐標系屏幕坐標系、窗口坐標系和和客戶區(qū)客戶區(qū)坐標系坐標系三種相互獨立的坐標系
18、。三種相互獨立的坐標系。n屏幕坐標系屏幕坐標系以屏幕左上角為原點,一些與整個屏以屏幕左上角為原點,一些與整個屏幕 有 關 的 函 數 均 采 用 屏 幕 坐 標 , 如幕 有 關 的 函 數 均 采 用 屏 幕 坐 標 , 如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。彈出式彈出式菜單使用的也是屏幕坐標。菜單使用的也是屏幕坐標。n窗口坐標系窗口坐標系以窗口左上角為坐標原點,它包括窗以窗口左上角為坐標原點,它包括窗口標題欄、菜單欄和工具欄等范圍??跇祟}欄、菜單欄和工具欄等范圍。n客戶區(qū)坐標系客戶區(qū)坐標系以窗口客戶區(qū)左上角為原
19、點,主要以窗口客戶區(qū)左上角為原點,主要用于客戶區(qū)的繪圖輸出和窗口消息的處理。鼠標用于客戶區(qū)的繪圖輸出和窗口消息的處理。鼠標消息的坐標參數使用客戶區(qū)坐標,消息的坐標參數使用客戶區(qū)坐標,CDC類繪圖成類繪圖成員函數使用與客戶區(qū)坐標對應的邏輯坐標。員函數使用與客戶區(qū)坐標對應的邏輯坐標。坐標之間的相互轉換坐標之間的相互轉換n編程時,有時需要根據當前的具體情況進行三編程時,有時需要根據當前的具體情況進行三種設備坐標之間或與邏輯坐標的相互轉換。種設備坐標之間或與邏輯坐標的相互轉換。nMFC提供了兩個函數提供了兩個函數CWnd:ScreenToClient()和和CWnd:ClientToScreen()用
20、于屏幕坐標與客用于屏幕坐標與客戶區(qū)坐標的相互轉換。戶區(qū)坐標的相互轉換。nMFC提供了兩個函數提供了兩個函數CDC:DPtoLP()和和CDC: LPtoDP()用于設備坐標與邏輯坐標之間的相互用于設備坐標與邏輯坐標之間的相互轉換。轉換。 n生成設備環(huán)境,就可以開始繪制不同形狀的幾何生成設備環(huán)境,就可以開始繪制不同形狀的幾何圖形,圖形,GDI提供了繪制基本圖形的提供了繪制基本圖形的成員函數成員函數,這,這些函數封裝在些函數封裝在MFC的的CDC類中。類中。CDC類提供的類提供的繪圖函數繪圖函數包括點、直線、曲線、矩形、橢圓、弧包括點、直線、曲線、矩形、橢圓、弧、扇形、弦形和多邊形等、扇形、弦形和
21、多邊形等供用戶使用供用戶使用。如果進行如果進行復雜繪圖的話,就需要通過算法來組織這些基本復雜繪圖的話,就需要通過算法來組織這些基本繪圖函數來完成繪圖。繪圖函數來完成繪圖。n繪圖函數使用的坐標都是邏輯坐標。繪圖函數使用的坐標都是邏輯坐標。 繪制基本圖形繪制基本圖形 函函 數數功功 能能SetPixel用指定的顏色在指定的坐標畫一個點MoveTo移動當前位置到指定的坐標,函數返回以前位置的坐標。LineTo從當前位置到指定位置畫一條直線Polyline從當前位置開始,根據函數參數繪制多條折線。PolyBezier根據兩個端點和兩個控制點繪制貝濟埃(Bezier)曲線。Rectangle根據指定的左
22、上角和右下角坐標繪制一個矩形RoundRect繪制一個圓角矩形。Ellipse根據指定的矩形繪制一個內切橢圓Arc根據指定的矩形繪制內切橢圓上的一段弧邊ArcTo該函數功能與Arc函數相同,不同之處在于畫弧成功后Pie繪制扇形Chord繪制弦形,弦形是一條橢圓弧和其對應的弦所組成的封閉圖形。Polygon根據兩個或兩個以上頂點繪制一個多邊形DrawIcon在指定位置畫一個圖標,如果成功函數返回非0,否則返回0。畫線畫線nLineTo函數用于繪制一條從當函數用于繪制一條從當前繪圖位置前繪圖位置到到指定坐標點的直線段,其函數聲明如下:指定坐標點的直線段,其函數聲明如下:nBOOL LineTo(i
23、nt x, int y);nBOOL LineTo(POINT point);n參數參數x和和y,及參數,及參數point指定了坐標點指定了坐標點,默認默認情況下從情況下從(0,0)開始畫開始畫 利用利用MFC AppWizard建立一個建立一個SDI應用程序應用程序,在在OnDraw()函數中添加如下程序代碼:函數中添加如下程序代碼: pDC-LineTo(10,10);POINT p1;p1.x = 100;p1.y = 100;/使用使用POINT結構結構pDC-LineTo(p1);CPoint p2;p2.x = 200;p2.y = 100;/使用使用CPoint類類pDC-Lin
24、eTo(p2);移動畫筆移動畫筆MoveTo函數用于將當前繪圖位置移到指函數用于將當前繪圖位置移到指定的坐標點處,函數聲明如下:定的坐標點處,函數聲明如下:CPoint MoveTo(int x, int y);CPoint MoveTo(POINT point);參數參數x和和y,及參數,及參數point指定了新的當前繪指定了新的當前繪圖位置坐標。返回值是圖位置坐標。返回值是CPoint對象實例,對象實例,它包含了新的當前繪圖位置坐標。它包含了新的當前繪圖位置坐標。Rectangle函數函數用于繪制矩形,其函數聲明如下:用于繪制矩形,其函數聲明如下:BOOL Rectangle(int x1
25、, int y1, int x2, int y2);BOOL Rectangle(LPCRECT lpRect);其中第一個函數參數給出了兩組點坐標,第其中第一個函數參數給出了兩組點坐標,第一組為矩形的左上角點坐標,第二組為矩形一組為矩形的左上角點坐標,第二組為矩形的右下角點坐標。第二個函數使用了指向矩的右下角點坐標。第二個函數使用了指向矩形區(qū)域結構的指針作為參數,也可以使用形區(qū)域結構的指針作為參數,也可以使用CRect類。如果繪圖成功,函數返回類。如果繪圖成功,函數返回TRUE,否則返回,否則返回FALSE。修改修改OnDraw函數,輸入如下代碼:函數,輸入如下代碼:pDC-Rectangl
26、e(50,50,200,80);CRect r;r.left = 100;r.right=200;r.top = 100;r.bottom = 200;pDC-Rectangle(r);(left,top是左上角坐標,是左上角坐標,right,bottom是右下角坐標)是右下角坐標)nEllipse函數用于繪制橢圓或者圓,其函函數用于繪制橢圓或者圓,其函數聲明如下:數聲明如下:nBOOL Ellipse(int x1, int y1, int x2, int y2);nBOOL Ellipse(LPCRECT lpRect);n其中,第一個函數的參數其中,第一個函數的參數x1和和y1指定了指定
27、了要繪制的橢圓或者圓的外接矩形的左上要繪制的橢圓或者圓的外接矩形的左上角點坐標,參數角點坐標,參數x2和和y2指定了要繪制的指定了要繪制的橢圓或者圓的外接矩形的右下角點坐標橢圓或者圓的外接矩形的右下角點坐標。第二個函數的參數使用了矩形區(qū)域結。第二個函數的參數使用了矩形區(qū)域結構來存放外接矩形的左上角和右下角坐構來存放外接矩形的左上角和右下角坐標。如果繪圖成功,函數返回標。如果繪圖成功,函數返回TRUE,否,否則返回則返回FALSE。修改修改OnDraw函數,輸入如下代碼:函數,輸入如下代碼:pDC-Ellipse(50,50,200,80);Arc函數用于繪制一個橢圓形的弧線,它函數用于繪制一個
28、橢圓形的弧線,它是一個指定的矩形的內切橢圓的一段。所是一個指定的矩形的內切橢圓的一段。所繪制弧線的實際起點是該內切橢圓與一條繪制弧線的實際起點是該內切橢圓與一條直線的交點,而該直線是從橢圓中心到指直線的交點,而該直線是從橢圓中心到指定點的連線?;【€的實際終點也是如此。定點的連線。弧線的實際終點也是如此。如圖所示:如圖所示:函數聲明如下:函數聲明如下:BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);函數參數給出了四對坐標:第一對坐標是要繪制函數參數給出了四對坐標:第一對坐標是要繪制的圓弧所在橢圓的外
29、接矩形的左上角坐標;第的圓弧所在橢圓的外接矩形的左上角坐標;第二對坐標是要繪制的圓弧所在橢圓的外接矩形二對坐標是要繪制的圓弧所在橢圓的外接矩形的右下角坐標;第三對坐標指定了圓弧的起點的右下角坐標;第三對坐標指定了圓弧的起點;第四對坐標指定了圓弧的終點。在畫圓弧時;第四對坐標指定了圓弧的終點。在畫圓弧時,默認的圓弧方向是逆時針默認的圓弧方向是逆時針,即圓弧是按逆時,即圓弧是按逆時針方向從起點到終點的。針方向從起點到終點的。修改修改OnDraw函數,輸入如下代碼:函數,輸入如下代碼:pDC-Arc(100,100,300,300,100,150,250,150);Pie函數用于繪制扇形,它是由橢圓
30、弧與函數用于繪制扇形,它是由橢圓弧與其起始點和終止點所對應的橢圓的半徑所其起始點和終止點所對應的橢圓的半徑所圍成的圖形,其函數聲明如下:圍成的圖形,其函數聲明如下:BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);其參數含義與其參數含義與Arc函數相同,差別在于函數相同,差別在于Arc函數只繪制了橢圓弧,而函數只繪制了橢圓弧,而Pie函數將函數將橢圓弧所確定的扇形繪制出來。如果繪圖橢圓弧所確定的扇形繪制出來。如果繪圖成功,函數返回成功,函數返回TRUE,否則返回,否則返回FALSE。修改修改OnDr
31、aw函數,輸入如下代碼:函數,輸入如下代碼:pDC-Pie(100,100,300,300,100,150,250,150);nPolygon函數用于繪制一個封閉的多邊函數用于繪制一個封閉的多邊形,其函數聲明如下:形,其函數聲明如下:nBOOL Polygon(LPPOINT lpPoints, int nCount);n參數參數lpPoints存放的是多邊形的頂點坐存放的是多邊形的頂點坐標,標,nCount是多邊形的頂點數目,該參是多邊形的頂點數目,該參數必須大于數必須大于2。如果繪圖成功,函數返回。如果繪圖成功,函數返回TRUE,否則返回,否則返回FALSE。修改修改OnDraw函數,輸入
32、如下代碼:函數,輸入如下代碼:POINT p5;p0.x = 10;p0.y = 10;p1.x = 100;p1.y = 100;p2.x = 200;p2.y = 100;p3.x = 200;p3.y = 200;p4.x = 100;p4.y = 50;pDC-Polygon(p,5);在默認狀態(tài)下,當用戶創(chuàng)建一個設備環(huán)境并在其中在默認狀態(tài)下,當用戶創(chuàng)建一個設備環(huán)境并在其中繪圖時,系統(tǒng)使用設備環(huán)境缺省的繪圖工具及其屬繪圖時,系統(tǒng)使用設備環(huán)境缺省的繪圖工具及其屬性。如果要使用不同風格和顏色的繪圖工具進行繪性。如果要使用不同風格和顏色的繪圖工具進行繪圖,用戶必須重新為設備環(huán)境設置自定義的圖
33、,用戶必須重新為設備環(huán)境設置自定義的畫筆畫筆和和畫刷畫刷等繪圖工具。等繪圖工具。 畫筆和畫刷畫筆和畫刷 n 繪圖工具類主要包括繪圖工具類主要包括畫筆畫筆CPenCPen、畫刷、畫刷CbrushCbrush、字體、字體CFontCFont、位圖、位圖BitmapBitmap和調色板和調色板CpaletteCpalette等。類繼承關系如圖等。類繼承關系如圖CObjectnCPen類:類:GDI 畫筆,用于畫線。默認的畫筆用于繪制畫筆,用于畫線。默認的畫筆用于繪制與一個像素等寬的黑色實線。與一個像素等寬的黑色實線。nCBrush類:類:GDI 畫刷,用來填充一個封閉圖形對象畫刷,用來填充一個封閉圖
34、形對象(如矩形、圓形如矩形、圓形)的內部區(qū)域,默認的畫刷顏色是白色。的內部區(qū)域,默認的畫刷顏色是白色。nCFont類:類:GDI字體,用來繪制文本,可設置文字的大字體,用來繪制文本,可設置文字的大小、是否加粗、是否斜體、是否加下劃線等。小、是否加粗、是否斜體、是否加下劃線等。nCBitmap類:類:GDI 位圖,用于填充區(qū)域。位圖,用于填充區(qū)域。nCPalette類:類:GDI 調色板,包含系統(tǒng)可用的色彩信息調色板,包含系統(tǒng)可用的色彩信息,是應用程序和彩色輸出設備環(huán)境,是應用程序和彩色輸出設備環(huán)境(如顯示器如顯示器)的接口。的接口。nCRgn類:類:GDI 區(qū)域,用于設備環(huán)境區(qū)域,用于設備環(huán)境
35、(通常是窗口通常是窗口)內的內的區(qū)域操作,通常和區(qū)域操作,通常和CDC類中與裁剪類中與裁剪(clipping)有關的成有關的成員函數配合使用。員函數配合使用。39 CDC類提供了成員函數類提供了成員函數SelectObject()選擇選擇用戶自己創(chuàng)建的用戶自己創(chuàng)建的GDI對象,該函數有多種重載形式對象,該函數有多種重載形式,可以選擇用戶已定制好的畫筆、畫刷、字體和位,可以選擇用戶已定制好的畫筆、畫刷、字體和位圖等不同類型的圖等不同類型的GDI對象。對象。 CPen* SelectObject(CPen* pPen); CBrush* SelectObject(CBrush* pBrush);
36、virtual CFont*SelectObject(CFont* pFont); CBitmap*SelectObject(CBitmap*pBitmap); 函數參數是一個指向用戶已定制好的函數參數是一個指向用戶已定制好的GDI對象對象的指針,的指針,選擇操作成功函數將返回以前選擇操作成功函數將返回以前GDI對象的對象的指針,否則返回指針,否則返回NULL。選擇一個選擇一個GDI對象對象: 顏色的設置顏色的設置lWindows用用COLORREF類型的數據存放顏色,類型的數據存放顏色,它是一個它是一個32位整數。任何一種顏色都是由紅、綠、位整數。任何一種顏色都是由紅、綠、藍三種基本顏色組成
37、,藍三種基本顏色組成,COLORREF類型數據的低類型數據的低位字節(jié)存放紅色強度值,第位字節(jié)存放紅色強度值,第2個字節(jié)存放綠色強度個字節(jié)存放綠色強度值,第值,第3個字節(jié)存放藍色強度值,高位字節(jié)為個字節(jié)存放藍色強度值,高位字節(jié)為0,每一種顏色分量的取值范圍為每一種顏色分量的取值范圍為0到到255。 l直接設置直接設置COLORREF數據不太方便,數據不太方便,Windows提供了提供了RGB宏用于設置顏色,將其中的紅、綠、宏用于設置顏色,將其中的紅、綠、藍分量值轉換為藍分量值轉換為COLORREF類型的顏色數據:類型的顏色數據: RGB(byRed, byGreen, byBlue)l其中參數其
38、中參數byRed、byGreen和和byBlue分別表示分別表示紅、綠、藍分量值(范圍紅、綠、藍分量值(范圍0到到255)。)。 RGB宏的使用:宏的使用: 很多涉及到顏色的很多涉及到顏色的GDI函數都需要使用函數都需要使用COLORREF類型的參數,如設置背景色的成員函類型的參數,如設置背景色的成員函數數CDC:SetBkColor()、設置文本顏色的成員函設置文本顏色的成員函數數CDC:SetTextColor()。例如:例如: COLORREF rgbBkClr=RGB(192,192,192);/ 定義灰色定義灰色 pDC-SetBkCorlor(rgbBkClr)/ 背景色為灰色背景
39、色為灰色 pDC-SetTextColor(RGB(0,0,255);/ 文本顏色為蘭色文本顏色為蘭色標準彩色的標準彩色的RGB值值 顏色顏色RGBRGB分量值分量值顏色顏色RGBRGB分量值分量值淺紅255,0,0深紅128,0,0淺綠0,255,0深綠0,128,0淺藍0,0,255深藍0,0,128淺黃255,255,0深黃128,128,0淺青0,255,255深青0,128,128紫色255,0,255灰色192,192,192白色255,255,255黑色0,0,0 使用畫筆使用畫筆 當用戶創(chuàng)建一個用于繪圖的設備環(huán)境時,該設當用戶創(chuàng)建一個用于繪圖的設備環(huán)境時,該設備環(huán)境自動提供了一
40、個寬度為一個像素單位、風格備環(huán)境自動提供了一個寬度為一個像素單位、風格為實黑線為實黑線( (BLACK_PEN) )的缺省畫筆。如果要在設的缺省畫筆。如果要在設備環(huán)境使用自己的畫筆繪圖,首先需要創(chuàng)建一個指備環(huán)境使用自己的畫筆繪圖,首先需要創(chuàng)建一個指定風格的畫筆,然后將創(chuàng)建的畫筆選入設備環(huán)境,定風格的畫筆,然后將創(chuàng)建的畫筆選入設備環(huán)境,最后,在使用該畫筆繪圖結束后需要釋放該畫筆。最后,在使用該畫筆繪圖結束后需要釋放該畫筆。 1. 創(chuàng)建畫筆創(chuàng)建畫筆 創(chuàng)建畫筆最簡單的方法是調用創(chuàng)建畫筆最簡單的方法是調用CPen類的一個帶類的一個帶參數的構造函數來構造一個參數的構造函數來構造一個CPen類畫筆對象,以
41、類畫筆對象,以下代碼創(chuàng)建了一個紅色虛線畫筆:下代碼創(chuàng)建了一個紅色虛線畫筆:CPenPenNew (PS_DASH,1, RGB(255, 0, 0); 創(chuàng)建畫筆的第二種方法是首先構造一個沒有初始化的創(chuàng)建畫筆的第二種方法是首先構造一個沒有初始化的C P e n 類 畫 筆 對 象 , 然 后 調 用 成 員 函 數類 畫 筆 對 象 , 然 后 調 用 成 員 函 數CPen:CreatePen()創(chuàng)建定制的畫筆工具:創(chuàng)建定制的畫筆工具:CPen PenNew; PenNew.CreatePen(PS_DASH,1,RGB(255,0,0); 函數函數CreatePen()的的參數類型與帶參數的
42、參數類型與帶參數的CPen類類構造函數完全一樣。構造函數完全一樣。當畫筆對象的聲明與創(chuàng)建不在同一當畫筆對象的聲明與創(chuàng)建不在同一個地方時個地方時(如需要多次改變畫筆如需要多次改變畫筆)只有采用這種方法。只有采用這種方法。 畫筆式樣(畫筆式樣(Pen Style)樣樣 式式說說 明明樣樣 式式說說 明明PS_SOLID實線PS_DASHDOTDOT雙點劃線PS_DOT點線PS_NULL空的邊框PS_DASH虛線PS_INSIDEFRAME邊框實線PS_DASHDOT點劃線 創(chuàng) 建 畫 筆 后 必 須 調 用 成 員 函 數創(chuàng) 建 畫 筆 后 必 須 調 用 成 員 函 數 C D C : : Se
43、lectObject()將創(chuàng)建的畫筆選入當前設備環(huán)境。將創(chuàng)建的畫筆選入當前設備環(huán)境。如果選擇成功,函數如果選擇成功,函數SelectObject()將返回以前畫將返回以前畫筆對象的指針。選擇新的畫筆時應該保存以前的畫筆對象的指針。選擇新的畫筆時應該保存以前的畫筆對象,如下代碼所示:筆對象,如下代碼所示:CPen* pPenOldpPenOld=pDCSelectObject(&PenNew); 2. 選擇創(chuàng)建的畫筆選擇創(chuàng)建的畫筆 創(chuàng)建和選擇畫筆工具后,應用程序就可以使用創(chuàng)建和選擇畫筆工具后,應用程序就可以使用該畫筆繪圖。當繪圖完成后,應該通過調用成員函該畫筆繪圖。當繪圖完成后,應該通過
44、調用成員函數數CDC:SelectObject()恢復設備環(huán)境以前的畫筆恢復設備環(huán)境以前的畫筆工具,并通過調用成員函數工具,并通過調用成員函數CGdiObject:DeleteObject()釋放釋放GDI對象所占對象所占的內存資源,如下代碼所示:的內存資源,如下代碼所示: pDC-SelectObject(pPenOld);/ 恢復設備環(huán)境恢復設備環(huán)境DC中原來的畫筆中原來的畫筆 PenNew.DeleteObject();/ 刪除底層的刪除底層的GDI對象對象3. 還原畫筆還原畫筆 例例 編寫一個編寫一個SDI應用程序,繪制不同風格應用程序,繪制不同風格、寬度和顏色的直線。、寬度和顏色的直
45、線。 在在OnDraw()函數中添加如下所示的代碼:函數中添加如下所示的代碼:CPen CPen * *pPenOld, PenNew;pPenOld, PenNew;int nPenStyle= int nPenStyle= PS_SOLID, / PS_SOLID, / 實線實線 PS_DOT, / PS_DOT, / 點線點線PS_DASH, / PS_DASH, / 虛線虛線PS_DASHDOT, / PS_DASHDOT, / 點劃線點劃線PS_DASHDOTDOT, / PS_DASHDOTDOT, / 雙點劃線雙點劃線 PS_NULL,PS_NULL, / / 空的邊框空的邊框P
46、S_INSIDEFRAME, / PS_INSIDEFRAME, / 邊框實線邊框實線;LPTSTR strStyle=_T(Solid), _T(Dot), strStyle=_T(Solid), _T(Dot), _T(Dash), _T(DashDot), _T(DashDotDot), _T(Dash), _T(DashDot), _T(DashDotDot), _T(Null), _T(InsideFrame);_T(Null), _T(InsideFrame);pDC-TextOut(60,10, _T(pDC-TextOut(60,10, _T(用不同樣式的畫筆繪圖用不同樣式的畫
47、筆繪圖); ); for(int i=0; i7; i+)/ for(int i=0; iSelectObject(&PenNew); pPenOld=pDC-SelectObject(&PenNew); / / 選擇畫筆選擇畫筆 pDC-TextOut(10,30+20pDC-TextOut(10,30+20* *i,strStylei);i,strStylei);pDC-MoveTo(100,40+20pDC-MoveTo(100,40+20* *i);i);pDC-LineTo(200,40+20pDC-LineTo(200,40+20* *i);i);pDC-Selec
48、tObject(pPenOld); pDC-SelectObject(pPenOld); / / 恢復原來的畫筆恢復原來的畫筆PenNew.DeleteObject(); / PenNew.DeleteObject(); / 刪除底層的刪除底層的GDIGDI對象對象 else else MessageBox(_T(MessageBox(_T(不能創(chuàng)建畫筆!不能創(chuàng)建畫筆! ) ););n當創(chuàng)建一個設備環(huán)境時,該設備環(huán)境自動提供了一當創(chuàng)建一個設備環(huán)境時,該設備環(huán)境自動提供了一個填充色為白色(個填充色為白色(WHITE_BRUSH)的缺省畫刷的缺省畫刷。與畫筆一樣,也可以利用。與畫筆一樣,也可以利用
49、MFC畫刷類畫刷類CBrush創(chuàng)創(chuàng)建自己的畫刷,用于填充圖形的繪制。建自己的畫刷,用于填充圖形的繪制。n畫刷有三種基本類型:畫刷有三種基本類型:純色畫刷、陰影畫刷純色畫刷、陰影畫刷和和圖案圖案畫刷畫刷,CBrush類提供了多個不同重載形式的構造類提供了多個不同重載形式的構造函數。以下創(chuàng)建三種不同類型的畫刷:函數。以下創(chuàng)建三種不同類型的畫刷:CBrush brush1(RGB(255,0,0);/ 創(chuàng)建純色畫刷創(chuàng)建純色畫刷CBrushbrush2(HS_DIAGCROSS,RGB(0,255,0); / 創(chuàng)建陰影畫刷創(chuàng)建陰影畫刷CBrush brush3(&bmp);/ 創(chuàng)建圖案畫刷創(chuàng)建
50、圖案畫刷 使用畫刷使用畫刷 n創(chuàng)建畫刷也可先構造一個沒有初始化的創(chuàng)建畫刷也可先構造一個沒有初始化的CBrush類畫刷對象,然后調用類畫刷對象,然后調用CBrush類的初始化成員類的初始化成員函數創(chuàng)建定制的畫刷工具。函數創(chuàng)建定制的畫刷工具。CBrush類提供的常類提供的常用創(chuàng)建函數有:用創(chuàng)建函數有:CreateSolidBrush()用指定的用指定的顏色創(chuàng)建一個純色畫刷;顏色創(chuàng)建一個純色畫刷;CreateHatchBrush()用指定的陰影樣式和顏色創(chuàng)建一個陰影畫刷;用指定的陰影樣式和顏色創(chuàng)建一個陰影畫刷;CreatePatternBrush()用位圖創(chuàng)建一個圖案畫用位圖創(chuàng)建一個圖案畫刷;刷;C
51、reateSysColorBrush()用系統(tǒng)默認顏色創(chuàng)用系統(tǒng)默認顏色創(chuàng)建一個指定陰影樣式的畫刷。建一個指定陰影樣式的畫刷。陰影畫刷陰影畫刷使用預定義的六種陰影樣式進行繪圖。表使用預定義的六種陰影樣式進行繪圖。表2.3列列出了六種陰影樣式。出了六種陰影樣式。修改修改OnDraw函數,輸入如下代碼:函數,輸入如下代碼:CBrush brush(HS_CROSS,RGB(255,0,0);/構造一個十字交叉線的陰影線畫刷,前景色為紅色構造一個十字交叉線的陰影線畫刷,前景色為紅色CPen pen(PS_SOLID,2,RGB(0,0,255);/構造一個寬度為構造一個寬度為2,顏色為藍色的實線畫筆,
52、顏色為藍色的實線畫筆pDC-SelectObject(&pen);pDC-SelectObject(&brush);/選擇畫筆和畫刷選擇畫筆和畫刷pDC- Rectangle(200,200,300,300 );pen.DeleteObject();brush.DeleteObject(); /刪除畫筆和畫刷對象刪除畫筆和畫刷對象n很多很多Windows應用程序都需要顯示文本,并且,應用程序都需要顯示文本,并且,文本還是一些應用程序的主要處理對象,如文本還是一些應用程序的主要處理對象,如MS Word字處理軟件。字處理軟件。n文本與字體密切相關,輸出文本時選擇不同類型文本與字體
53、密切相關,輸出文本時選擇不同類型的字體在很大程度上影響程序的界面風格,合適的字體在很大程度上影響程序的界面風格,合適的字體可以增強程序的感染力。因此,對軟件用的字體可以增強程序的感染力。因此,對軟件用戶來說,文本輸出也是很重要的。戶來說,文本輸出也是很重要的。nWindows為文本的顯示提供了多種物理字體支持為文本的顯示提供了多種物理字體支持,而在程序中我們可以創(chuàng)建不同風格的邏輯字體,而在程序中我們可以創(chuàng)建不同風格的邏輯字體來輸出文本。來輸出文本。 文本與字體文本與字體 n以圖形方式進行文本的輸出是以圖形方式進行文本的輸出是Windows操作系統(tǒng)操作系統(tǒng)一個特性,文本輸出實際上是按照指定的字體
54、樣一個特性,文本輸出實際上是按照指定的字體樣式將文本中的每個字符繪制出來。式將文本中的每個字符繪制出來。n編程時最常用的文本輸出函數是編程時最常用的文本輸出函數是TextOut()函數函數,該函數只能輸出單行文本。要繪制多行文本可,該函數只能輸出單行文本。要繪制多行文本可以 調 用以 調 用 D r a w T e x t ( ) 函 數 , 另 一 個 函 數函 數 , 另 一 個 函 數ExtTextOut()可以用一個矩形框對輸出文本串進可以用一個矩形框對輸出文本串進行裁剪。行裁剪。 繪制文本繪制文本 n通過通過API函數函數TextOut執(zhí)行文本輸出操作。執(zhí)行文本輸出操作。nBOOL
55、TextOut(_in HDC hdc,_in int nXStart,_in int nYStart,_in LPCTSTR lpString,_in int cbString);n參數參數hdc為設備上下文的句柄;為設備上下文的句柄;n參數參數nXStart為起始點為起始點x坐標;坐標;n參數參數nYStart為起始點為起始點y坐標;坐標;n參數參數lpString為要輸出的文本字符串;為要輸出的文本字符串;n參數參數cbString為字符串中要輸出的字符的數為字符串中要輸出的字符的數量。量。n使用設備上下文類使用設備上下文類CDC的成員函數的成員函數TextOut來輸出來輸出,CDC:T
56、extOut函數的兩種重載形式函數的兩種重載形式nvirtual BOOL TextOut(int x,int y,LPCTSTR lpszString,int nCount);BOOL TextOut(int x,int y,const CString& str);n參數參數x指定文本起始點的指定文本起始點的x坐標;坐標;n參數參數y指定文本起始點的指定文本起始點的y坐標;坐標;n參數參數lpszString為要輸出的文本字符串;為要輸出的文本字符串;n參數參數nCount指定字符串中的字節(jié)個數;指定字符串中的字節(jié)個數;n參數參數str為包含要輸出的字符的為包含要輸出的字符的CStr
57、ing對象對象。(2)設置文本顏色)設置文本顏色 在默認情況下,在默認情況下,Windows繪制黑色文本??梢酝ㄟ^繪制黑色文本。可以通過SetTextColor()函數改變文本的顏色。例如:函數改變文本的顏色。例如:pDC-SetTextColor(RGB(255,0,0); /設置文本顏色為紅色設置文本顏色為紅色 可以通過可以通過GetTextColor()函數檢索到當前文本的顏色,例如函數檢索到當前文本的顏色,例如 COLORREF color=pDC-GetTextColor(); SetBkColor()和和GetBkColor()函數用于設置背景顏色和獲取函數用于設置背景顏色和獲取當
58、前的背景顏色。當前的背景顏色。(3)設置字符間距)設置字符間距 SetTextCharacterExtra()函數用來設置文本字符的間距,函數用來設置文本字符的間距,GetTextCharacterExtra()用來獲得當前文本字符的間距,用來獲得當前文本字符的間距,函數說明如下:函數說明如下: pDC- SetTextCharacterExtra(space); int space=pDC- GetTextCharacterExtra(); 其中,其中,space表示在文本字符之間使用的額外空間的像素數。表示在文本字符之間使用的額外空間的像素數。SetTextAlign()函數用于設置顯示文
59、本的對齊方式,函數用于設置顯示文本的對齊方式,函數說明如下:函數說明如下: pDC-SetTextAlign(alignment); 其中,其中,alignment參數取值:參數取值:TA_LEFT、TA_CENTER和和TA_RIGHT,分別表示左對齊、居中方,分別表示左對齊、居中方法和右對齊。法和右對齊。Alignment參數取值:參數取值:TA_TOP、TA_BOTTOM和和TA_BASELINE分別表示文本在垂直分別表示文本在垂直方向的對齊方式,上對齊、下對齊和字符的基線對齊。方向的對齊方式,上對齊、下對齊和字符的基線對齊。n 輸出文本時,默認情況下使用系統(tǒng)提供的缺省字輸出文本時,默認
60、情況下使用系統(tǒng)提供的缺省字體,如果需要可以改變顯示文本的字體。與畫筆和體,如果需要可以改變顯示文本的字體。與畫筆和畫刷一樣,字體也是一種畫刷一樣,字體也是一種GDI對象,對象,MFC類類CFont對對GDI字體對象進行了封裝,我們一般利用字體對象進行了封裝,我們一般利用CFont類創(chuàng)建自己的字體(類創(chuàng)建自己的字體(GDI對象),然后把創(chuàng)建的字對象),然后把創(chuàng)建的字體選入設備環(huán)境,以用于在設備環(huán)境中繪制文本。體選入設備環(huán)境,以用于在設備環(huán)境中繪制文本。 nWindows支持支持光柵字體、矢量字體光柵字體、矢量字體和和TrueType三種字體。光柵字體即點陣字體,這種字體需要為三種字體。光柵字體即點陣字體,這種字體需要為每一種大小的字體創(chuàng)建獨立的字體文件。矢量字體每一種大小的字體創(chuàng)建獨立的字體文件。矢量字體以一系列線段
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 撫順師范高等??茖W校《國際貿易實務實驗》2023-2024學年第二學期期末試卷
- 鄭州旅游職業(yè)學院《結構力學》2023-2024學年第二學期期末試卷
- 煙臺市龍口市2025年五下數學期末考試試題含答案
- 教育產品銷售部員工培訓
- 護理不良事件安全課件
- 電纜過水施工方案
- 信息技術 第二冊(五年制高職)課件 9.3.4 智能翻譯系統(tǒng)
- 信息技術 第二冊(五年制高職)課件 8.3.2 自定義函數
- 江蘇省鎮(zhèn)江市丹陽市2024-2025學年高一下學期3月月考化學試題(含答案)
- 收費站收費員業(yè)務知識解答
- 廉潔談話一問一答簡短六篇
- 校服采購投標方案(技術標)
- 兒童壓力性損傷評估量表與預防措施
- 高中數學開放題賞析
- 品質部工作計劃
- 《浙江省工業(yè)建設項目用地控制指標》(修訂)
- 微生物課件(老師版) 1.流感病毒
- 屁股-也許是最重要的學習器官-主題微班會
- 市政工程施工工期定額(定稿)
- 2023年大學生《思想道德與法治》考試題庫附答案(712題)
- 檢驗檢測機構開展新檢驗項目建議審批表
評論
0/150
提交評論