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