版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、VC+6簡明教程 第5章圖形和文本輸出Windows使用圖形設備接口(GDI)進行圖形輸出和文本輸出,MFC封裝了GDI對象,提供了CGdiObject類和CDC類支持圖形輸出和文本輸出,本章你將學習使用CGdiObject類和CDC類在視圖中輸出各種圖形和文本的方法和技巧。5.1圖形設備接口和CDC511圖形設備接口(GDI)Windows操作系統(tǒng)通過圖形設備接口,簡稱GDI(GraphicsDeviceInterface),管理Windows程序的所有圖形輸出,包括顯示在屏幕上的窗口,屏幕保護程序的運行,文檔的打印。GDI處理與不同輸出設備的連接,從而應用程序開發(fā)者不需要去考慮基礎硬件設備
2、之間的不同。應用程序可以使用GDI創(chuàng)建3種類型的圖形輸出:矢量圖形、光柵圖形和文本。1矢量圖形矢量圖形輸出是指創(chuàng)建線和填充圖形,包括點、直線、曲線、多邊形、扇形和矩形。2光柵圖形光柵圖形輸出是指光柵圖形函數(shù)對以位圖形式存儲的數(shù)據(jù)進行操作,它包括各種位圖和圖標的輸出。在屏幕上表現(xiàn)為對若干行和列的像素操作,在打印機上則是若干行和列的點陣輸出。光柵圖形是直接從內(nèi)存到顯存的拷貝操作,所以速度快,但是對內(nèi)存要求高。3文本文本輸出是GDI的另一項任務。輸出文本時文本的輸出位置的計算不是以行為單位,而是以邏輯坐標為單位計算。用戶可以設置文本的各種效果,如加粗、斜體、設置顏色等。MFC處理圖形輸出是通過設備上
3、下文CDC類和圖形對象CGdiObject類來完成的。512繪圖工具GDI對象CGdiObjectCGdiObject是MFC提供繪圖工具的類,它的派生類包括畫筆(CPen)、畫刷(CBrush)、字體(CFont)、位圖(CBitmap)、調(diào)色板(CPalette)、區(qū)域(CRgn)等,它們的繼承關系如圖5-1所示。圖CGdiObject類的構(gòu)成各個派生類的任務是:畫筆(CPen)封裝GDI畫筆,用于繪制對象的邊框以及直線和曲線。默認畫筆用于繪制與一個像素等寬的黑色實線。畫刷(CBrush)封裝GDI畫刷。畫刷是用來填充一個封閉的圖形對象(如矩形,圓形)的內(nèi)部區(qū)域。默認的畫刷顏色是白色。字體
4、(CFont)封裝GDI字體對象,用戶可以建立一種GDI字體,并使用CFont的成員函數(shù)來訪問它。主要影響文本輸出的效果,包括文字的大小、是否加粗、是否斜體、是否加下劃線等。位圖(CBitmap)封裝GDI位圖,提供成員函數(shù)裝載和位圖操作,位圖可以用于填充區(qū)域。調(diào)色板(CPalette)封裝GDI調(diào)色板,保存系統(tǒng)可用的色彩信息,是應用程序和彩色輸出設備上下文的接口。區(qū)域(CRgn)封裝GDI區(qū)域。區(qū)域是窗口內(nèi)的一塊多邊形或橢圓形區(qū)域。CRgn用于設備上下文(通常是窗口)內(nèi)的區(qū)域操作。CRgn通常與CDC類中與裁剪(clipping)有關的成員函數(shù)配合使用。513設備描述表(DC)設備上下文(D
5、eviceCoMe竝),簡稱DC,是由GDI創(chuàng)建用來代表設備連接的數(shù)據(jù)結(jié)構(gòu)。DC的主要功能有:允許應用程序使用一個輸出設備。提供窗口應用程序,設備驅(qū)動,和輸出設備之間的連接。保存當前信息,例如在一個窗口內(nèi)繪圖使用的顏色,畫筆的寬度、畫刷的類型等等。保存窗口剪取區(qū)域(clippingregion),限制程序輸出到輸出設備中窗口覆蓋的區(qū)域。514設備上下文類(CDC)MFC封裝了DC,提供CDC類及它的子類訪問GDI,如圖5-2所示,各類作用介紹如下。圖CDC及子類CDC類封裝了所有圖形輸出函數(shù),包含了一個DC的創(chuàng)建和初始化,及通用GDI對象的操作,包括畫簡單圖形(如線、矩形、橢圓)和復雜的功能(
6、如區(qū)域、位圖、剪切區(qū)域)的操作。CDC類的適應范圍最廣,不僅能支持窗口,還能支持打印機。ClientDC類CClientDC又名客戶區(qū)設備上下文,用于客戶區(qū)的輸出,一般在響應非窗口消息并對客戶區(qū)繪圖時要用到該類,例如在鼠標雙擊時要輸出文本等。CPaintDCCPaintDC用于響應窗口重繪消息(WM_PAINT)的繪圖輸出,不僅可對客戶區(qū)進行操作,還可以對非客戶區(qū)進行操作。CWindowDCCWindowDC用于窗口客戶區(qū)和非客戶區(qū)(包括窗口邊框、標題欄、控制按鈕等)的繪制,除非要自己繪制窗口的邊框和按鈕,否則一般不用它。CMetaFileDCCMetaFileDC專門用于圖元文件的繪制。圖元
7、文件記錄一組GDI操作命令,可以通過這一組GDI命令重建圖形輸出。使用CMetaFileDC時,所有的圖形輸出命令會自動記錄到一個與CMetaFileDC相關的圖元文件中。515OnDraw函數(shù)當用AppWizard創(chuàng)建單文檔或多文檔應用程序時,視圖類包含成員函數(shù)OnDraw()函數(shù),CDC指針被傳遞給OnDraw()函數(shù),下面的程序清單5-1顯示了在視圖窗口中輸出一行文本的一個簡單的OnDraw()函數(shù)。程序清單:用于輸出的OnDraw函數(shù)voidCExam5View:OnDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc)
8、;/TODO:adddrawcodefornativedataherepDC-TextOut(1,1,”helloworld!”);J當視圖窗口或窗口的一部分需要重繪時,系統(tǒng)會發(fā)給窗口一個WM_PAINT消息,MFC的窗口框架會將該消息映射到CWnd:OnPaint()函數(shù),OnPaint()函數(shù)創(chuàng)建一個DC,并調(diào)用視圖的OnDraw()函數(shù)。5.1.6WM_PAINTWM_PAINT消息是最重要的繪圖消息,它要求窗口重新繪制內(nèi)容。產(chǎn)生WM_PAINT消息的場合通常有:(1窗)口移動后及最大化,最小化后的刷新。被覆蓋區(qū)域的刷新,如下拉菜單覆蓋的區(qū)域。無效區(qū)域產(chǎn)生后的刷新,如執(zhí)行滾動條操作,將一
9、區(qū)域移動至不可見。有時數(shù)據(jù)發(fā)生變化時,需要人為生成一個繪制消息,重繪窗口,可以調(diào)用幾個CWnd的函數(shù)。表5-1產(chǎn)生繪制消息的函數(shù)函數(shù)舉例說明Invalidate(TRUE);此函數(shù)聲明整個客戶區(qū)無效CRectRect(l,l,300,300)InvalidateRect(&Rect,TRUE)此函數(shù)聲明選定的區(qū)域無效,這樣可以減少因重繪而產(chǎn)生的屏幕閃爍517獲取設備上下文(DC)繪圖前必須準備好設備上下文(DC),在一個MFC應用程序獲得DC的常用方法有兩種:一種是接受一個參數(shù)為指向CDC對象的指針,另一種是構(gòu)造CClientDC對象。一些消息處理函數(shù)可以通過參數(shù)接受指向CDC對象的指針,如O
10、nDraw()函數(shù)。程序清單:用于輸出一個黑點的OnDraw函數(shù)voidCExam5View:0nDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahere/在坐標為10,10的位置上畫一點,顏色為黑色pDC-SetPixel(CPoint(10,10),RGB(0,0,0);J也可以使用CClientDC類創(chuàng)建一個局部DC對象,例如,在鍵盤響應消息處理函數(shù)和鼠標響應消息處理函數(shù)中要進行文本輸出或圖形繪制時,通常要創(chuàng)建一個這樣的對象,并使用this指針為該對象賦值
11、。程序清單:在鼠標點擊畫一紅點的鼠標左鍵單擊消息處理函數(shù)voidCExam5View:OnLButtonDown(UNITnFlags,CPointpoint)/TODO:adddrawcodefornativedatahereCClientDCdc(this);/this指針將CExam5View賦值給創(chuàng)建的dc對象dc.SetPixel(point,RGB(255,0,0);CView:OnLButtonDown(nFlags,point);5.1.8編程實例【例5-1】編寫一個單文檔MFCEXE程序Exam5_l,在視圖類增加成員變量,追蹤鼠標左鍵雙擊的最新坐標,并輸出坐標信息,運行效果
12、如圖所示。1使用AppWizard2為視圖類增加成員(1)選擇WorkSp;MemberVariabie采單項,增加CPoint類的公有成員變量m_LPoint。在CExam5_1View類的構(gòu)造函數(shù)CExam5_1View()中,初始化變量m_LPoint為0,0。如程序清單5-4所示。程序清單:CPoint類型對象引用CExam5_1View:CExam5_1View()/TODO:addconstructioncodeherem_LPoint.x=0;m_LPoint.y=0;3.在OnDraw()函數(shù)中添加代碼,在第一行輸出成員變量的值。如程序清單5-5粗體部分所示。程序清單:在視圖中
13、輸出整型數(shù)據(jù)的OnDraw函數(shù)voidCExam5_1View:OnDraw(CDC*pDC)CExam51Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereCStringstr;str.Format(“鼠標左鍵雙擊的位置是%d,%d”,m_LPoint.x,m_LPoint.y);pDC-TextOut(0,0,str);4在視圖類增加鼠標左鍵雙擊的消息映射,修改成員變量,更新視圖打開ClassWizard,選擇MessageMap標簽,ClassName列表中選擇CExam5_lView,
14、ObjectIDS列表中選擇CExam5_1View,Messages列表中選擇WM_LBUTTONDBLCLK,單擊“AddFunction”按鈕,添加鼠標左鍵雙擊消息映射。(2)單擊“EditCode”按鈕,添加處理代碼,用當前鼠標位置Point值替換m_LPoint的值,并設置無效區(qū)域,刷新視圖。程序清單:產(chǎn)生重繪消息的鼠標消息處理函數(shù)voidCExam5_1View:OnLButtonDblClk(UINTnFlags,CPointpoint)/TODO:Addyourmessagehandlercodehereand/orcalldefaultm_LPoint=point;Inval
15、idate(TRUE);CView:OnLButtonDblClk(nFlags,point);J5編譯、鏈接、執(zhí)行,可得到如圖5-3所示的結(jié)果5.2處理文本在窗口應用程序中經(jīng)常使用GDI處理文本輸出,文本的輸出過程包括文本的屬性設置、字體設置、文本格式化、調(diào)用文本輸出函數(shù)輸出文本等具體的過程,下面將分別講述。5.2.1設置文本顏色在窗口操作系統(tǒng)中采用32位來表示顏色,MFC和SDK采用COLORREF數(shù)據(jù)結(jié)構(gòu)表示顏色,COLORREF的結(jié)構(gòu)如圖5-4所示,采用8位(值域范圍為0-255)分別表示紅、藍、綠三色。定義顏色的最簡單的方法是使用RGB()宏,它采用三個參數(shù),用0-255的值來表示紅
16、色、藍色、綠色。同樣使用宏GetRValue(),GetGValue(),GetBValue()可以從一個COLORREF類型的變量中分離三元色。DataTypeMacros圖顏色的表示常用設備顏色清單基本三元色COLORREFcrRed=RGB(255,0,0);COLORREFcrGreen=RGB(0,255,0);COLORREFcrBlue=RGB(0,0,255)/16-color設備支持顏色constCOLORREFg_crBlack=RGB(0,0,0);constCOLORREFg_crYellow=RGB(255,255,0);constCOLORREFg_crDkYell
17、ow=RGB128,128,0);constCOLORREFg_crRed=RGB(255,0,0);constCOLORREFg_crDkRed=RGB(128,0,0);constCOLORREFg_crMagenta=RGB(255,0,255);constCOLORREFg_crDkMagenta=RGB128,0,128);constCOLORREFg_crBlue=RGB(0,0,255);constCOLORREFg_crDkBlue=RGB(0,0,128);constCOLORREFg_crCyan=RGB(0,255,255);constCOLORREFg_crDkCyan
18、=RGB(0,128,128);constCOLORREFg_crGreen=RGB(0,255,0);constCOLORREFg_crDkGreen=RGB(0,128,0);constCOLORREFg_crGray=RGB(192,192,192);constCOLORREFg_crDkGray=RGB(128,128,128);constCOLORREFg_crWhite=RGB(255,255,255);/256色設備支持的顏色舉例constCOLORREFg_crLtYellow=RGB(255,251,240);constCOLORREFg_crLtGreen=RGB(192,
19、220,192);constCOLORREFg_crLtBlue=RGB(166,202,240);constCOLORREFgcrMedGreen=RGB(160,160,164);設置顏色的場合有設置文本顏色、設置畫筆和畫刷的顏色。設置畫筆和畫刷的顏色的方法我們將在介紹GDI對象時講述,設置文本顏色包括設置前景色和背景色。為了設置在繪制文本的前景像素時使用的顏色,調(diào)用CDC:SetTextColor(),函數(shù)定義如下:COLORREFSetTextColor(COLORREFcrColor);(2)為了設置在繪制文本的背景像素時使用的顏色,調(diào)用CDC:SetBkColor(),函數(shù)定義如下
20、:COLORREFSetBkColor(COLORREFcrColor);對Exam5_l程序增加實現(xiàn)產(chǎn)生黑色背景,紅色文本的視圖。程序清單見下面粗體部分:程序清單:在視圖中設置顏色白勺OnDraw函數(shù)voidCExam5_1View:0nDraw(CDC*pDC)CExam5_1Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherepDC-SetTextColor(RGB(255,0,0);pDC-SetBkColor(RGB(0,0,0);CStringstr;str.Format(”鼠標左鍵
21、雙擊的位置是%d,%d,m_LPoint.x,m_LPoint.y);pDC-TextOut(0,0,str);J5.2.2設置文本顯示屬性CDC還提供了設置文本顯示屬性的函數(shù),下表5-2列出了三組控制文本的顯示屬性常用函數(shù)表文本屬性設置函數(shù)函數(shù)說明SetBkMode和GetBkMode設置和獲得背景模式SetTextAlign和GetTextAlign設置和獲得對齊方式SetTextJusttificationSetTextCharaterExtra調(diào)整文本文本背景模式的默認設置是OPAQUE,它要求GDI用戶要使用背景顏色,可替換設置為TRANSPARENT,要求GDI用戶在繪制文本時,不
22、要使用背景色,函數(shù)的格式:intCDC:SetBkMode(intnBkMode);SetBkMode()函數(shù)返回先前的背景模式,nBkMode表示背景模式,只有兩種:OPAQUE和TRANSPARENT。intCDC:GetBkMode()const;GetBkMode()函數(shù)返回當前使用的背景模式。文本對齊描述了(x,y)文本坐標和文本框之間的關系。默認設置將文本與文本坐標右下方對齊??墒褂肧etTextAlign函數(shù)設置文本對齊,函數(shù)格式:UINTSetTextAlign(UINTnFlags);nFlag為表5-3中列出的標志的組合,各欄中的標志之間相互排斥,只能從一欄中取一種標志,第
23、一行為系統(tǒng)的默認設置值,例如:pDC-SetTextAlign(TA_RIGHT|TA_TOP);表文本對齊風格X軸對齊Y軸對齊更新當前位置TALEFTTATOPTANOUPSATECPTACENTERTABASELINETAUPDATECPTARIGHTTABOTTOM如果準備將不同字體,不同字號的文本混合在一行,使用y軸默認設置TA_TOP將產(chǎn)生奇怪的現(xiàn)象,這時應該更改y軸默認設置為TA_BOTTOM。SetTextJusttification()和SetTextCharaterExtra()函數(shù)用于設置文本屬性:文本調(diào)整和文本額外間隔。這兩種屬性能夠幫助填補文本行。填補文本行是為了生成W
24、YSIWYG(所見即所得)輸出。在大多數(shù)情況下,它意味著顯示屏幕輸出變形,以模仿打印輸出的效果。SetTextJusttification()函數(shù)能夠指定添加到各個間隔字符的像素數(shù),如果需要更多地填充,則應調(diào)用SetTextCharaterExtra()函數(shù),將額外的像素添加到各個字符(而不是間隔字符)。5.2.3設置字體字體是一組復雜的圖形圖像,大小和設計都是統(tǒng)一的,用于表示字符數(shù)據(jù)。字體通常由磅值、名稱和風格標識的,如8磅粗體Arial這樣的風格。處理字體的最簡單的方法是使用GDI的常備字體,如要自己設置顯示字體的風格需要創(chuàng)建一個CFont的對象,具體步驟如下:定義CFont對象調(diào)用Cre
25、ateFont()函數(shù)創(chuàng)建字體將創(chuàng)建的字體對象選入DC,并保存前一個被選入DC的字體對象CreateFont()函數(shù)包括大量參數(shù),具體解釋如下:格式:BOOLCreateFont(intnHeight,/字體所需高度,為0使用默認值intnWidth,/字符的寬度值,為0表示設備的縱橫比匹配可用字體的縱橫比intnEscapement,/字體轉(zhuǎn)義,指定轉(zhuǎn)義矢量和x軸的夾角intnOrientation,/字體方向,指定字符基線和x軸的夾角(以0.1度為單位)intnWeight,/字體厚度BYTEbltalic是否斜體,布爾值BYTEbUnderline,/是否帶有下劃線,布爾值BYTEcSt
26、rikeOut,/是否帶有刪除線,布爾值BYTEnCharSet,/使用的字符集BYTEnOutPrecision,/輸出精度BYTEnClipPrecision,/剪取精度BYTEnQuality,/輸出質(zhì)量BYTEnPitchAndFamily,/字符間距和字族LPCTSTRlpszFacename/字體的字樣名稱);返回值:如果成功,返回非0值;失敗,返回0值。參數(shù):nWeight字體厚度常用參數(shù)有:FW_NORMAL、FW_REGULAR和FW_BOLDnCharSet字符集常用參數(shù)有:ANSI_SHARSET、DEFAULT_CHARSET、SYBOL_CHARSET、SHIFTJI
27、S_CHARSET、OEM_CHARSET等nOutPrecision輸出精確度定義。輸出與請求使用的字體的高度、寬度、字符走向、轉(zhuǎn)義和字間距的匹配程度,常用參數(shù)有:OUT_CHARACTER_PRECIS、OUT_STRING_PRECIS、OUT_DEFAULT_PRECIS、OUT_DEVICE_PRECIS等等。nClipPrecision剪取精度定義。如何剪取部分位于剪取區(qū)域之外的字符,常用參數(shù)有:CLIP_CHARACTER_PRECIS、CLIP_DEFAULT_PRECIS、CLIP_MASK。nQuality字體的輸出質(zhì)量定義。GDI怎樣才能將邏輯字體屬性與實際物理字體匹配起
28、來,常用參數(shù)值:DEFAULT_QUALITY、DRAFT_QUALITY和PROOF_QUALITY。nPitchAndFamily通常是字符間距與字族的組合值,如:DEFAULT_PITCH|FF_DONTCARE下面通過實例顯示字體對象的創(chuàng)建和使用。運行效果如圖5-5所示:9voidASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereCFontNewFont;NewFont.CreateFont(65,65,0,0,FW_DONTCARE,true,false,false,DEFAULT_CHARSET,OUT_CHARACTER_P
29、RECIS,CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,黑體);CFont*pOldFont;pOldFont=pDC-SelectObject(&NewFont);pDC-TextOut(10,10,傾斜的黑體字);5.2.4格式化文本W(wǎng)indows系統(tǒng)不參與窗口客戶區(qū)的管理,這就意味著在客戶區(qū)內(nèi)輸出文本,應用程序必須管理換行,后繼字符的位置等輸出格式。由于文本字符串的間隔不僅取決于由用戶指定的字體,而且取決于目標設備的分辨率,因此在繪制任何文本之前,需要計算文本坐標CDC類提供了如下表所示的文本測量函數(shù)。表
30、5-4文本測量函數(shù)函數(shù)說明GetTextExtent當選用當前嵌入DC中的字體繪圖時,獲得給定字符串將占據(jù)的空間寬度和高度GetTextMetries為當前選入DC的字體獲取類型為TEXTMETRIC的數(shù)據(jù),此數(shù)據(jù)結(jié)構(gòu)中包含基本的字體測量信息字體測量函數(shù)的使用的場合通常有:1確定后繼文本坐標在很多場合單行文本需要分離成多次輸出,即多次調(diào)用TextOut()。例如在藍色文本的后邊顯示紅色文本,或者是在同一行文本上使用字體。這時需要計算下一個字符串的位置,使用GetTextExtent()函數(shù)可以獲得所選字體中的字符串的寬度和高度,函數(shù)的格式如下:CSizeGetTextExtent(LPCTST
31、RlpszString,intnCount)其中:IpszString是字符串的指針,nCount是所包括的字符數(shù)。返回值CSize是包含兩個成員的結(jié)構(gòu):ex是字符串的寬度,cy是字符串的高度。下面給出了一個使用GetTextExtent()函數(shù)的實例。運行效果如圖5-6所示,實現(xiàn)代碼如程序清單5-9所示。其中GetLength()函數(shù)是CString類的成員函數(shù),返回字符串的長度。程序清單:在視圖中輸出一行使用兩種顏色的文本voidCExam5View:0nDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:a
32、dddrawcodefornativedatahereintx,y;x=150;y=100;CStringstrHello=Hello;CStringstrVc=VC+!;/輸出第一個藍色字符串pDC-SetTextColor(RGB(0,0,255);pDC-TextOut(x,y,strHello);/取得第一個字符串的像素長度CSizestrSize=pDC-GetTextExtent(strHello,strHello.GetLength();設定第二個字符串的輸出位置X坐標x+=strSize.cx;/輸出第二個綠色字符串pDC-SetTextColor(RGB(0,255,0);p
33、DC-TextOut(x,y,strVc);2確定換行時文本坐標GetTextMetric()函數(shù)用來計算涉及確定兩行文本之間的間隔。當然你可以使用GetTextExtent()函數(shù)的返回值中的字符串的高度來決定兩行文本之間的間隔,但這種方式并不精確。文本中行之間的間隔包括兩部分:字符單元高度和外部行距大小。這兩部分內(nèi)容都包含在TEXTMETRIC數(shù)據(jù)結(jié)構(gòu)中。調(diào)用GetTextMetric()函數(shù)可以獲得當前字體的TEXTMETRIC結(jié)構(gòu)的內(nèi)容,并計算文本行間隔方式如下:TEXTMETRICtm;pDC-GetTextMetrics(&tm);intLineHeight=tm.tmHeight
34、+tm.tmExternalLeading;數(shù)據(jù)類型TEXTMETRIC的定義和圖示如下:typedefstructtagTEXTMETRIC/*tm*/inttmHeight;Internal_-BaselinegtAscentHeightrO;V1F-Width-tDescentOriginTopofthecharactercellCell圖5-字7體結(jié)構(gòu)圖inttmAscent;inttmDescent;inttmInternalLeading;inttmExternalLeading;inttmAveCharWidth;inttmMaxCharWidth;inttmWeight;BYT
35、EtmItalic;BYTEtmUnderlined;BYTEtmStruckOut;BYTEtmFirstChar;BYTEtmLastChar;BYTEtmDefaultChar;BYTEtmBreakChar;BYTEtmPitchAndFamily;BYTEtmCharSet;inttmOverhang;inttmDigitizedAspectX;inttmDigitizedAspectY;TEXTMETRIC;5.2.5文本輸出函數(shù)CDC提供了以下幾個函數(shù)用于文本輸出:表5-5文本輸出函數(shù)函數(shù)說明TextOut在屏幕的固定位置用當前設定的顏色、字體、對齊方式輸出文本TabbedTex
36、tOut與TextOut的功能相似,唯一差別是可以為支持制表符而定義一組制表站位置DrawText在一個區(qū)域中顯示并格式化文本ExtTextOut與TextOut的功能相似,但可以使用該函數(shù)刪去超出矩形的正文,用正文背景填充矩形,調(diào)整字符間隔TextOut()是最常用的文本輸出函數(shù),它的格式:BOOLCDC:TextOut(intx,inty,constCString&str);其中:x,y是輸出位置的坐標,str是要輸出的文本串。在輸出文本之前,應先設置輸出文本串的顏色、字體及對齊方式。使用DrawText()函數(shù)可以在一個指定的區(qū)域中輸出文本,并且可以在這個區(qū)域內(nèi)進行水平和垂直方向的對齊方
37、式的設置,還可以在一個詞中間斷開以適應矩形邊界。它的格式如下:intCDC:DrawText(constCString&str,LPRECTlpRect,UINTnFormat);函數(shù)正確執(zhí)行后返回文本行的高度,str是輸出的文本,IpRect是指定矩形輸出區(qū)域,nFormat是格式常量。下面給出了一個使用DrawText()的實例。程序清單:在視圖中使用DrawText在一個矩形區(qū)域中水平垂直居中,輸出藍色文本的OnDraw函數(shù)voidCExam5View:OnDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO
38、:adddrawcodefornativedataherepDC-SetTextColor(RGB(0,0,255);CRectRect;Rect.SetRect(100,100,300,300);pDC-Rectangle(Rect);pDC-DrawText(thisisasampleofDrawText!,Rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);J執(zhí)行效果如圖5-8所示:圖5-9文本處理實例程序清單:在視圖中處理文本的OnDraw函數(shù)voidCExam5_2View:OnDraw(CDC*pDC)CExam5_2Doc*pDoc=GetDocum
39、ent();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereinty;intx;CStringoutstr4;outstr0=第一個紫紅色的使用系統(tǒng)字體的文本串;outstr1=第二個黃色黑體文本串;outstr2=第三個藍色文本串;outstr3=最后一個大號字,加下劃線的斜體文本串;x=0;y=0;/輸出第一行pDC-SetTextColor(RGB(255,0,255);pDC-TextOut(x,y,outstr0);/輸出第二行TEXTMETRICtm;pDC-GetTextMetrics(&tm);y=y+tm.tmHeig
40、ht+100*tm.tmExternalLeading;CFontNewFont1;NewFont1.CreateFont(30,10,0,0,FW_HEAVY,false,false,false,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,黑體);CFont*pOldFont;pOldFont=pDC-SelectObject(&NewFont1);pDC-SetTextColor(RGB(255,255,0);pDC-TextOut(x,y,out
41、str1);/輸出第三個文本串pDC-GetTextMetrics(&tm);pDC-SetTextColor(RGB(0,0,255);CSizestrSize=pDC-GetTextExtent(outstr1,outstr1.GetLength();x+=strSize.cx;pDC-TextOut(x,y,outstr2);/輸出第四個文本串pDC-GetTextMetrics(&tm);x=0;y=y+tm.tmHeight+20*tm.tmExternalLeading;CFontNewFont2;NewFont2.CreateFont(30,0,0,0,FW_NORMAL,tru
42、e,true,false,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULTQUALITY,DEFAULT_PITCH|FF_DONTCARE,大號字);pDC-SelectObject(&NewFont2);pDC-SetTextColor(RGB(155,155,155);pDC-TextOut(x,y,outstr3);pDC-SelectObject(pOldFont);pDC-SelectObject(&NewFont2);pDC-SetTextColor(RGB(155,155,155);pDC-TextOut(x
43、,y,outstr3);pDC-SelectObject(pOldFont);J分析如表5-所6示:表文本屬性格式化字體文本串紅色默認字體文本串綠色求下一行位置高度,寬度,粗體,黑體字文本串藍色求同行字符串尾部位置文本串灰色求下一行位置高度0斜體,下劃線,大號字請注意pOldFont的使用,在第一次調(diào)用SelectObject()函數(shù),函數(shù)返回老的字體設置,由CFont對象指針pOldFont接受,在OnDraw()函數(shù)的最后再使用SelectObject()是恢復原來的字體設置。5.3處理繪圖5.3.1簡單的圖形輸出CDC提供了基本的繪圖操作函數(shù),如畫點,畫線,畫圓,畫矩形,畫多邊形等等,簡
44、單介紹如下1點pDC-SetPixel(CPoint(200,200),RGB(255,0,0);/在200,200的位置畫一個紅點2線/直線起點的坐標為(0,0)/從起點(0,0)到終點(100,100)畫一條直線/畫一個長100,寬100的矩形/在矩形內(nèi)畫圓/在矩形內(nèi)畫橢圓pDC-MoveTo(0,0);pDC-LineTo(100,100);pDC-MoveTo(0,100);pDC-LineTo(100,0);3矩形CRectrect(0,0,100,100);pDC-Rectangle(&rect);4圓和橢圓CRectrect(0,0,100,100);pDC-Ellipse(&r
45、ect);CRectrect(0,0,50,100);pDC-Ellipse(&rect);/畫一個平行四邊形5多邊形CPointpoly4;poly0=CPoint(0,0);poly1=CPoint(50,50);poly2=CPoint(50,100);poly3=CPoint(0,50);pDC-Polygon(poly,4);6其它圖形VC+6簡明教程 # CDC:PieCDC:ChordCDC:FillRectCDC:Draw3DRectCDC:RoundRect/畫餅圖/畫弦/用指定顏色填充矩形且不畫邊線用于繪制名種3D邊框/畫圓角矩形繪圖函數(shù)的具體的使用方法可以查閱MSDN。5
46、.3.2庫存對象不管以CDC類指針形式還是以CDC子類對象形式獲得設備上下對象,系統(tǒng)都默認指定了一組繪圖屬性,如表5-7所示。表5-7系統(tǒng)默認繪圖屬性繪圖屬性默認值改變默認值的函數(shù)畫筆一個像素寬的黑色實線SelectObject,SelectStockObject畫刷白色的實心刷SelectObject,SelectStockObject背景顏色白色SetBKColor背景模式OPAQUESetBKMode刷子原點設備坐標(0,0)SetBrushOrg當前繪圖位置邏輯坐標(0,0)MoveTo混合模式R2COPYPENSetRop2映射模式MMTEXTSetMapMode庫存對象是由操作系統(tǒng)
47、維護的用于繪制屏幕的常用對象,包括庫存畫筆、畫刷、字體等。使用SelectStockObject()函數(shù)可以直接選擇庫存對象修改系統(tǒng)默認值。可直接選用的庫存對象如表5-8所示。表5-8系統(tǒng)默認繪圖屬性GDI分類庫存對象值FontsANSI_FIXED_FONTANSI_VAR_FONTDEVICE_DEFAULT_FONTOEM_FIXED_FONTSYSTEMFONTPensBLACK_PENWHITE_PENNULLPENVC+6簡明教程VC+6簡明教程BrushsBLACK_BRUSHDKGRAY_BRUSHGRAY_BRUSHHOLLOW_BRUSHLTGRAY_BRUSHNULL_B
48、RUSHWHITEBRUSH下面的實例演示了如何使用庫存對象:程序清單:在視圖中選用畫筆和畫刷庫存對象畫圖的OnDraw函數(shù)voidCExam5View:0nDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedatahereCRectrect;rect.SetRect(CPoint(0,0),CPoint(200,200);pDC-SelectStockObject(WHITE_PEN);/選用白色畫筆pDC-SeIectStockObject(GRAY_BRUSH);選
49、用灰色畫刷pDC-Rectangle(rect);pDC-MoveTo(0,0);pDC-LineTo(200,200);pDC-MoveTo(0,200);pDC-LineTo(200,0);J演示效果如圖5-10所示。VC+6簡明教程第5章圖形與文本輸出 5.3.3設置繪圖坐標系首先要介紹邏輯坐標和設備坐標的概念,一般地說,如果要把一幅大小為400mmX800mm的圖畫顯示在500像素X200像素的windows窗口中,前者稱為邏輯坐標,后者稱為設備坐標。它們的關系如圖5-11所示:設備坐標圖5-1邏1輯坐標與設備坐標設備坐標系的原點總是在窗口的左上角,它的單位是像素。而邏輯坐標系的單位有
50、多種,可以是像素,也可以是厘米、毫米、英寸等,邏輯坐標按映像模式可分為三大類,一共八種模式:(1M)M_TEXT默認的映像模式,原點在左上角,向右x增加,向下y增加。固定比例的映射模式向右x增加,向下y減少。可變比例的映射模式允許改變比例因子和原點。在用戶改變窗口大小時,繪制的內(nèi)容會隨之改變。如果改變一個軸的比例,則所繪的圖像也會在其它軸上相應的改變。表5-9映像模式類別映像模式名稱邏輯單位默認模式MMTEXT像素固定比例的映射模式MMLOMETRIC0.1mmMMHIMETRIC0.01mmMMLOENGLISHO.OlinchMMHIENGLISH0.001inchMMTWIPS1/144
51、0inch可變比例的映射模式MMISOTROPIC可調(diào)整(x=y)MMANISOTROPIC可調(diào)整(x!=y)要準確的確定繪圖效果,要正確地設置映像模式,可以使用CDC:SetMapMode()函數(shù)更改映像模式。例如:CClientDCdc;intOldMode=dc.SetMapMode(MM_LOMETRIC);并可以使用CDC:SetViewportOrg()函數(shù)和CDC:SetWindowOrg函數(shù)移動邏輯坐標系的原點。例如,下面程序語句段將坐標系的原點移動到客戶區(qū)中央:CRectrect;GetClientRect(rect);pDC-SetViewportOrg(rect.widt
52、h()/2,rect.height()/2);現(xiàn)在所面臨的問題是如何區(qū)分使用邏輯坐標和設備坐標的場合。一般來說,MFC的CDC繪圖函數(shù)都使用邏輯坐標為參數(shù);CWnd的成員函數(shù)一般使用設備坐標為參數(shù),如返回鼠標位置作為屏幕位置測試時,一般也是使用設備坐標。設備坐標系統(tǒng)分為三類:工作區(qū)(Viewport)坐標系統(tǒng)它以窗口客戶區(qū)左上角為原點(0,0),主要用于窗口客戶區(qū)繪圖輸出以及處理窗口的一些消息。鼠標消息傳給框架的位置消息參數(shù)以及CDC一些用于繪圖的成員都是使用工作區(qū)坐標。窗口(Windows)坐標系統(tǒng)它以窗口左上角為坐標原點(0,0),它包含窗口控制菜單、標題欄等內(nèi)容。一般情況下很少在窗口標題
53、欄上繪圖,因此這種坐標系統(tǒng)很少使用。屏幕(Screen)坐標系統(tǒng)它以屏幕左上角為原點(0,0)。當以CreateDC()或GetDC()取得設備上下文使用的是屏幕坐標系。一般設置和取得光標的位置的函數(shù)SetCursorPos()和GetCursorPos()是使用屏幕坐標;彈出式菜單使用屏幕坐標;CreateWindow()、MoveWindow()等函數(shù)用于設置窗口相對于屏幕的位置,使用的也是屏幕坐標系統(tǒng)。MFC使用ClientToScreen()和ScreenToClient()兩個函數(shù),用于完成工作區(qū)坐標和屏幕坐標之間的轉(zhuǎn)換工作。邏輯坐標和設備坐標的轉(zhuǎn)換是經(jīng)常發(fā)生的事情,例如,用戶在視圖
54、滾動后單擊鼠標,會得到鼠標的設備坐標。如果要保存這個數(shù)據(jù)到文檔,則需要把它轉(zhuǎn)化為邏輯坐標。相反,當調(diào)用MFC繪圖函數(shù)繪圖時,Windows自動將邏輯坐標轉(zhuǎn)換成設備坐標再繪圖。CDC也提供了成員函數(shù)LPToDP()和DPToLP()完成兩種坐標之間的轉(zhuǎn)換。5.3.5節(jié)中例5-3演示了不同映像模式的使用。5.3.4創(chuàng)建和使用自定義畫筆和畫刷創(chuàng)建CPen的方法有兩種:定義時直接創(chuàng)建CPenMypen(PS_SOLD,2,RGB(255.0.0);定義CPen對象,再調(diào)用CreatePen()函數(shù)CPenpen;pen.CreatePen(PS_SOLD,2,RGB(255,0,0);其中第一個參數(shù)是
55、筆的風格,可選值有:PS_SOLD(實線),PS_DOT(虛線),PS_NULL(空畫筆)。第二個參數(shù)是線的寬度,第三個參數(shù)是線的顏色。表5-1畫0筆樣式及說明樣式說明樣式說明PSDASH虛線PSINSIDEFTAME實線(邊框線)PSDASHDOT點劃線PSNULL無PSDASHDOTDOT雙點劃線PSSOLID實線PSDOT點線創(chuàng)建畫刷的方法有下面幾種:(1)創(chuàng)建實心畫刷CreateSolidBrush()函數(shù)CBrushbs;bs.CreateSoIidBrush(RGB(255,0,0);創(chuàng)建一個紅色的實心畫刷表5-1畫1刷的樣式及說明樣式說明樣式說明BLACKBRUSH黑色畫刷LTG
56、RAYBRUSH亮灰色畫刷DKGRAYBRUSH深灰色畫刷NULLBRUSH空畫刷GRAYBRUSH灰色畫刷WHITEBRUSH白畫刷HOLLOWBRUSH空心畫刷創(chuàng)建帶陰影的畫刷CreateHatchBrush()函數(shù)bs.CreateHatchBrush(HS_CROSS,RGB(255,0,0);創(chuàng)建一個十字線陰影的紅色畫刷表5-1陰2影畫刷樣式及說明樣式說明樣式說明HSBDIAGONAL45度HSCROSS+HSDIAGCROSS45度叉線HSHORIZONTALHSFDIAGONAL45度/HSVERTICAL|(3)創(chuàng)建位圖畫刷CreatePatternBrush()函數(shù)CBitM
57、apbmp;bmp.LoadBitMap(IDB_MYBITMAP);CBrushbs;bs.CreatePatternBrush(&bmp);使用自定義畫筆和畫刷的方式和使用自定義字體的方法類似,創(chuàng)建自定義對象后,調(diào)用SelectObject()函數(shù)將對象選入設備上下文即可。下面的示例中演示了使用和創(chuàng)建畫筆和畫刷。首先通過使用創(chuàng)建的藍色,寬度為5的畫筆畫一個圖形的邊界,然后用當前的刷子填充這個圖形來創(chuàng)建一個填充圖形。共有三個填充圖形:第一個是用深藍色實心畫刷填充的帶圓角的矩形,第二個是用亮灰畫刷填充的餅圖,第三個是用陰影風格的畫刷填充的橢圓。程序清單:在視圖中繪制圖形的OnDraw函數(shù)voi
58、dCExam5View:0nDraw(CDC*pDC)CExam5Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherepDC-SetMapMode(MM_ANISOTROPIC);/設置映像模式CPenNewPen,OldPen;/創(chuàng)建藍色畫筆NewPen.CreatePen(PS_SOLID,5,RGB(0,0,255);pDC-SelectObject(&NewPen);/將畫筆選入設備上下文CBrushNewBrush1,NewBrush2;/創(chuàng)建深藍色實心畫刷NewBrush1.Crea
59、teSolidBrush(RGB(0,0,128);pDC-SelectObject(&NewBrush1);/將畫刷選入設備上下文pDC-RoundRect(200,100,330,200,15,15);/繪制圓角矩形pDC-SelectStockObject(LTGRAY_BRUSH);/將庫存對象亮灰畫刷選入設備上下文pDC-Pie(350,50,420,150,360,50,400,50);/繪制餅圖NewBrush2.CreateHatchBrush(HS_DIAGCROSS,RGB(125,125,125);/創(chuàng)建陰影畫刷pDC-SelectObject(NewBrush2);/繪
60、制橢圓pDC-Ellipse(50,50,150,150);J回岡運行效果如圖5-12所示。壓無標題-ExamS文件(E)編輯(E)查看匹)幫助迫)535圖形輸出編程實例就緒數(shù)字【例5-3】設置映像和映像模式。編寫程序Exam5_3,初始階段按模式MMTEXT繪圖,在一個圓角矩形內(nèi)內(nèi)嵌一個橢圓,圓角矩形以黑色填充,橢圓以白色填充。用戶通過單擊鼠標來改變映像模式,單擊鼠標左鍵時,設置映像模式為MM_ISOTROPIC,并調(diào)用InvalidateRect函數(shù)刷新用戶區(qū),在用戶單擊鼠標右鍵時,設置映像模式為MM_ANISOTROPIC,同時刷新用戶區(qū)。運行效果如圖所示VC+6簡明教程第5章圖形與文本
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年細紋棉麻油畫布項目可行性研究報告
- 2025年中國個人衛(wèi)星定位導航儀手持機市場調(diào)查研究報告
- 2025年玻璃填充柱項目可行性研究報告
- 2025年往復纏繞打包鋼帶項目可行性研究報告
- 2025年四點接觸軸承項目可行性研究報告
- 2025年光學柱面鏡項目可行性研究報告
- 二零二五年度煤炭價格指數(shù)編制與應用協(xié)議
- 2025至2030年野菊花營養(yǎng)霜項目投資價值分析報告
- 二零二五年度能源合同能源管理在綠色物流中的應用合同
- 2025至2030年多層紙塑包裝袋項目投資價值分析報告
- 音樂教學集訓課程設計
- 山東省濰坊市2024-2025學年高三上學期期末 地理試題(含答案)
- IEC-62368-1-差異分享解讀
- 2022-2023學年廣東省佛山市順德區(qū)高三(下)模擬英語試卷
- 節(jié)后復工培訓內(nèi)容五篇
- GB/T 33322-2016橡膠增塑劑芳香基礦物油
- GA 1051-2013槍支彈藥專用保險柜
- 某水毀公路維修工程施工方案
- 建設工程監(jiān)理合同示范文本GF-2018-0202
- 2022質(zhì)檢年終工作總結(jié)5篇
- 江蘇省中等職業(yè)學校學業(yè)水平考試商務營銷類(營銷方向)技能考試測試題
評論
0/150
提交評論