教學(xué)材料《可視化程序設(shè)計Visual C++》-5_第1頁
教學(xué)材料《可視化程序設(shè)計Visual C++》-5_第2頁
教學(xué)材料《可視化程序設(shè)計Visual C++》-5_第3頁
教學(xué)材料《可視化程序設(shè)計Visual C++》-5_第4頁
教學(xué)材料《可視化程序設(shè)計Visual C++》-5_第5頁
已閱讀5頁,還剩131頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

5.1設(shè)備環(huán)境與設(shè)備環(huán)境類5.1.2設(shè)備環(huán)境類設(shè)備環(huán)境類(CDC)直接繼承于CObject類,該類定義了一類設(shè)備對象。CDC對象提供了非常多的成員函數(shù),與設(shè)備環(huán)境的顯示器、打印機等一起工作。例如,如果要在顯示器等設(shè)備上繪制圖形,可以用MFC提供的設(shè)備環(huán)境類CDC類,因為CDC類中包含了繪圖所需要的所有成員函數(shù)。同時,MFC還提供了以下幾個CDC的派生類。1.CPaintDC類此類比較特殊,它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是針對OnPaint進(jìn)行的。用戶一旦獲得相關(guān)的CDC指針,就可以將它當(dāng)作任何設(shè)備環(huán)境(包括屏幕、打印機)指針來使用,CPaintDC類的構(gòu)造函數(shù)會自動調(diào)用BeginPaint函數(shù),而它的析構(gòu)函數(shù)則會自動調(diào)用EndPaint函數(shù)。上一頁下一頁返回5.1設(shè)備環(huán)境與設(shè)備環(huán)境類2.CClientDC和CWindowDC類CClientDC只能在窗口的客戶區(qū)(不包括邊框、工具條、標(biāo)題欄、滾動條、菜單欄以及狀態(tài)欄)進(jìn)行繪圖,點(0,0)通常指的是客戶區(qū)的左上角。其構(gòu)造函數(shù)調(diào)用GetDC,析構(gòu)函數(shù)調(diào)用ReleaseDC函數(shù)。CWindowDC允許在窗口的任意位置中進(jìn)行繪圖,點(0,0)指整個窗口的左上角。其構(gòu)造函數(shù)調(diào)用GetWindowDC,析構(gòu)函數(shù)調(diào)用ReleaseDC函數(shù)。3.CMetaFileDC類封裝了在一個Windows圖元文件中繪圖的方法。圖元文件是一系列與設(shè)備無關(guān)的圖片的集合,由于它對圖像的保存比像素更精確,因而往往在要求較高的場合下使用,例如:AutoCAD的圖像保存等。目前的Windows已使用增強格式(enhanced-format)的32位圖元文件來進(jìn)行操作。設(shè)備環(huán)境類CDC及其派生類如圖5.1

所示。上一頁返回5.2繪圖程序5.2.1CDC基類CDC類是其他DC類的基類,CDC類封裝了使用設(shè)備環(huán)境的各種圖形設(shè)備接口(GDI)函數(shù),它用于定義一個設(shè)備環(huán)境對象,并提供了在顯示器、打印機和窗口的客戶區(qū)域上畫圖的方法。1.在視圖類的OnDraw()函數(shù)中繪圖在視圖類的OnDraw函數(shù)中繪圖時,直接使用OnDraw()函數(shù)中的CDC形參指針pDC,調(diào)用它的函數(shù)進(jìn)行繪圖。[例5.1]繪制矩形與文本。(1)創(chuàng)建一個單文檔應(yīng)用程序,名為“顯示繪圖”。(2)在視圖類的實現(xiàn)文件“顯示繪圖View.cpp”的OnDraw函數(shù)中添加如下代碼:下一頁返回5.2繪圖程序voidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//選擇畫刷,淺灰色畫刷,見表5.2pDC->SelectStockObject(LTGRAY_BRUSH);CRectrect(10,10,200,70);//定義一個矩形pDC->Rectangle(rect);//繪制一個矩形pDC->TextOut(20,80,"我們會編制圖形程序了!");//繪制文本pDC->TextOut(20,100,”努力學(xué)好VisualC++!”);}(3)編譯運行,結(jié)果如圖5.2

所示。上一頁下一頁返回5.2繪圖程序說明:SelectStockObject()該函數(shù)檢索預(yù)定義的備用筆、刷子、字體或者調(diào)色板的句柄。參數(shù):LTGRAY_BRUSH——亮灰色畫筆;BLACK_BRUSH——黑色畫筆;NULL_BRUSH——空畫筆(相當(dāng)于HOLLOW_BRUSH);WHITE_BRUSH——白色畫筆;BLACK_PEN——黑色鋼筆;……2.在視圖類的一般函數(shù)中繪圖[例5.2]在鼠標(biāo)放下函數(shù)WM_LBUTTONDOWN中繪圖。(1)創(chuàng)建一個單文檔應(yīng)用程序,名為:一般函數(shù)繪圖。(2)利用MFCClassWizard將鼠標(biāo)放下WM_LBUTTONDOWN消息映射到視圖類CMyView中,并添加下列代碼:voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){//定義一個矩形上一頁下一頁返回5.2繪圖程序CRectrect(0,0,100,100);//GetDC檢索整個屏幕的設(shè)備上下文環(huán)境CDC*pDC=GetDC();pDC->Rectangle(rect);//繪制矩形ReleaseDC(pDC);//釋放pDC空間CView::OnLButtonDown(nFlags,point);}(3)編譯運行,用鼠標(biāo)單擊窗口,出現(xiàn)如圖5.3

所示的矩形。上一頁下一頁返回5.2繪圖程序5.2.2CPaintDC類CPaintDC對象代表了一個窗口的繪圖畫面,主要用來繪圖。它可以用來處理來自Windows的WM_PAINT消息。改變窗口大小或移動覆蓋在窗口上的對話框時,Windows會發(fā)送WM_PAINT消息以通知客戶區(qū)的變動,而WM_PAINT消息的處理是在OnPaint()消息處理函數(shù)中進(jìn)行的。[例5.3]在WM_PAINT消息函數(shù)中繪圖。(1)創(chuàng)建一個單文檔的應(yīng)用程序,名為:繪圖。(2)利用MFCClassWizard將WM_PAINT消息映射到視圖類(View)中,并添加下列代碼:voidCMyView::OnPaint(){CPaintDCdc(this);上一頁下一頁返回5.2繪圖程序//調(diào)用MoveTo函數(shù),定點到點(10,10)dc.MoveTo(10,10);//調(diào)用LineTo函數(shù),畫線到點(100,100)dc.LineTo(100,100);//畫線//調(diào)用畫橢圓函數(shù)Ellipse畫橢圓dc.Ellipse(120,120,160,160);}(3)編譯運行,結(jié)果如圖5.4

所示。上一頁下一頁返回5.2繪圖程序5.2.3CClientDC類CClientDC類用來自動處理對描述窗口的客戶程序區(qū)域的設(shè)備環(huán)境進(jìn)行調(diào)用和釋放。在CClientDC類創(chuàng)建時自動調(diào)用GetDC(),在撤銷時將自動調(diào)用ReleaseDC()。[例5.4]在客戶區(qū)畫一條直線。(1)創(chuàng)建一個單文檔的應(yīng)用程序,名為:畫直線。(2)利用MFCClassWizard將鼠標(biāo)放下WM_LBUTTONDOWN消息映射到視圖類CMyView中,并添加下列代碼:voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CClientDCdc(this);CRectrect;//定義一個矩形上一頁下一頁返回5.2繪圖程序//取得客戶區(qū)矩形區(qū)域GetClientRect(&rect);//調(diào)用MoveTo函數(shù),定點到客戶區(qū)的左上角dc.MoveTo(rect.left,rect.top);//調(diào)用LineTo函數(shù),畫線到客戶區(qū)的右下角dc.LineTo(rect.right,rect.bottom);}(3)編譯運行,用鼠標(biāo)左鍵單擊窗口任一點,便在窗口上畫一條直線,如圖5.5

所示。上一頁返回5.3圖形設(shè)備接口對象GDI(GraphicDeviceInterface)對象與設(shè)備環(huán)境對象的關(guān)系,類似于筆和紙的關(guān)系。也就是說,GDI提供了用于在DC上畫圖的繪圖工具。MFC的GDI中包含了各種繪圖類并提供了各類的繪圖函數(shù),即定義了若干種對于Windows的繪圖工具的對象,該類的繼承關(guān)系如圖5.6

所示;GDI中包含的各種繪圖類有一個共同的抽象基類CGdiObject,具體如表5.1

所示。1.使用GDI對象選擇GDI對象進(jìn)行繪圖時,一般要遵循下列步驟。(1)定義一個GDI對象(如CPen、CBrush對象),然后用相應(yīng)的函數(shù)(如CreatePen、CreateSolidBrush)創(chuàng)建此GDI對象。但要注意有些GDI派生類的構(gòu)造函數(shù)允許用戶提供足夠的信息,從而一步即可完成對象的創(chuàng)建任務(wù),這些類有CPen、CBrush。下一頁返回5.3圖形設(shè)備接口對象(2)將構(gòu)造的GDI對象選入當(dāng)前設(shè)備環(huán)境中,但不要忘記將原來的GDI對象保存起來。(3)繪圖結(jié)束后,恢復(fù)當(dāng)前設(shè)備環(huán)境中原來的GDI對象。2.庫存的GDI對象除了自定義的GDI對象外,Windows還包含了一些預(yù)定義的庫存GDI對象。由于它們是Windows系統(tǒng)的一部分,因此用戶不用刪除它們。CDC的成員函數(shù)SelectStockObject可以把一個庫存對象選入當(dāng)前設(shè)備環(huán)境中,并返回之前被選中的對象指針,同時使之前被選中的對象從設(shè)備環(huán)境中分離出來。函數(shù)SelectStockObject可選用的庫存GDI對象類型可以是表5.2

所示值之一。上一頁下一頁返回5.3圖形設(shè)備接口對象5.3.1畫筆CPen類CPen類封裝了一個WindowsGDI畫筆,并且提供了用于操作CPen對象的若干方法。CPen類用來決定畫線的風(fēng)格和顏色。在使用畫筆之前,首先必須構(gòu)造畫筆對象,有以下兩種方法。(1)構(gòu)造和初始化對象都在帶參數(shù)的構(gòu)造函數(shù)中一步完成,如生成顏色為綠色,寬度為2個像素的實心畫筆:CPennewPen(PS_SOLID,2,RGB(0,255,0))。(2)構(gòu)造初始化分兩步完成,構(gòu)造由不帶參數(shù)的構(gòu)造函數(shù)完成,而初始化由初始化函數(shù)完成。如生成顏色為紅色,寬度為2個像素的實心畫筆:上一頁下一頁返回5.3圖形設(shè)備接口對象CPennewPen;newPen.CreatePen(PS_SOLID,2,RGB(255,0,0));參數(shù):①PS_SOLID——畫筆的風(fēng)格,見表5.3所列;②2——畫筆的寬度(2個像素);③RGB(255,0,0)——畫筆的顏色。(3)CreatePenIndirect函數(shù)也用于創(chuàng)建畫筆對象,它的作用與CreatePen函數(shù)完全一樣,只是畫筆的3個屬性不是直接出現(xiàn)在函數(shù)參數(shù)中,而是通過一個LOGPEN結(jié)構(gòu)間接地給出。BOOLCreatePenIndirect(LPLOGPENlpLogPen);此函數(shù)用由LOGPEN結(jié)構(gòu)指針指定的相關(guān)參數(shù)創(chuàng)建畫筆。LOGPEN結(jié)構(gòu)如下:上一頁下一頁返回5.3圖形設(shè)備接口對象TypedefstructtagLOGPEN{UINTlopnStyle//畫筆風(fēng)格POINTlopnWidth;//POINT結(jié)構(gòu)的y不起作用,而用x表示畫筆寬度COLORREFlopnColor//畫筆顏色}LOGPEN注意:(1)當(dāng)修飾畫筆的寬度大于1個像素時,畫筆的風(fēng)格只能取PS_NULL、PS_SOLID或PS_INSIDEFRAME,定義為其他風(fēng)格不會起作用。(2)畫筆的創(chuàng)建工作也可在畫筆的構(gòu)造函數(shù)中進(jìn)行,它具有下列原型:CPen(intnPenStyle,intnWidth,COLORREFcrColor);上一頁下一頁返回5.3圖形設(shè)備接口對象[例5.5]用顏色為藍(lán)色、寬度為8個像素的實心畫筆,畫線和橢圓。(1)創(chuàng)建一個單文檔的應(yīng)用程序,名為:畫筆。(2)利用ClassWizard將WM_PAINT消息映射到視圖類(View)中,并添加下列代碼:voidCMyView::OnPaint(){CDC*pDC=GetDC();//獲得顯示設(shè)備環(huán)境DC的指針pDCCPennewPen;//定義圖筆對象//生成一支顏色為藍(lán)色,寬度為8個像素的實心畫筆newPen.CreatePen(PS_SOLID,8,RGB(0,0,255));//將創(chuàng)建的畫筆選入內(nèi)存DC,同時暫停擠出并保存原畫筆CPen*poldpen=pDC->SelectObject(&newPen);上一頁下一頁返回5.3圖形設(shè)備接口對象pDC->MoveTo(10,10);//調(diào)用MoveTo函數(shù),定位于點(10,10)pDC->LineTo(100,100);//調(diào)用LineTo函數(shù),畫線至點(100,100)pDC->Ellipse(120,120,160,160);//調(diào)用畫橢圓函數(shù)Ellipse//恢復(fù)內(nèi)存DC中原有的畫筆pDC->SelectObject(poldpen);ReleaseDC(pDC);//釋放顯示DC}(3)編譯運行,結(jié)果如圖5.7

所示。注意:默認(rèn)的畫筆為黑色、一個像素的寬度、實心。如例5.4中的OnPaint()函數(shù)中沒有創(chuàng)建畫筆,則用默認(rèn)的畫筆繪圖。默認(rèn)的畫刷為白色。上一頁下一頁返回5.3圖形設(shè)備接口對象5.3.2畫刷CBrush類CBrush類封裝了一個WindowGDI畫刷,并且提供了用于操作CBrush對象的若干方法。畫刷可設(shè)置畫刷的色彩和區(qū)域填充的繪圖方法。在使用畫筆、畫刷之前,首先必須構(gòu)造畫筆、畫刷對象。(1)構(gòu)造和初始化對象都在帶參數(shù)的構(gòu)造函數(shù)中一步完成,如:CBrushnewBrush(RGB(0,0,255));//藍(lán)色畫刷(2)構(gòu)造和初始化分兩步完成,構(gòu)造由不帶參數(shù)的構(gòu)造函數(shù)完成,而初始化由初始化函數(shù)完成,如:CBrushnewBrush;newBrush.CreateSolidBrush(RGB(0,0,255));上一頁下一頁返回5.3圖形設(shè)備接口對象(3)CBrush類根據(jù)畫刷屬性提供了相應(yīng)的創(chuàng)建函數(shù),例如創(chuàng)建填充畫刷和填充樣式畫刷函數(shù)為:CreateSolidBrush和CreateHatchBrush,它們的原型如下:BOOLCreateSolidBrush(COLORREFcrColor);//創(chuàng)建填充色畫刷BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);//創(chuàng)建填充樣式畫刷參數(shù):①nIndex用于指定畫刷的內(nèi)部填充樣式。②crColor表示畫刷的填充色。與畫筆類似,畫刷也有一個LOGBRUSH邏輯結(jié)構(gòu)用于畫刷屬性的定義,并通過CBrush的成員函數(shù)CreateBrushIndirect來創(chuàng)建,其原型如下:上一頁下一頁返回5.3圖形設(shè)備接口對象BOOLCreateBrushIndirect(constLOGBRUSH*lpLogBrush);參數(shù):LOGBRUSH結(jié)構(gòu)如下。TypedefstructtagLOGBRUSH{UINTlbStyle;//風(fēng)格COLORREFlbColor;//填充色LONGlbHatch;//填充樣式}LOGBRUSH;(4)畫刷的創(chuàng)建工作也可在其構(gòu)造函數(shù)中進(jìn)行,其原型如下:CBrush(COLORREFcrColor);CBrush(intnIndex,COLORREFcrColor);CBrush(CBitmap*pBitmap);上一頁下一頁返回5.3圖形設(shè)備接口對象(5)畫刷也可用位圖來指定其填充圖案,但該位圖應(yīng)該是8×8像素,若位圖太大,Windows則只使用其左上角的8×8的像素。(6)畫刷僅對一些繪圖函數(shù)有效,如:Ellipse、FillRect函數(shù)等。[例5.6]用顏色為紅色、寬度為6個像素的實心畫筆畫矩形,用綠色畫刷填充矩形內(nèi)部。(1)創(chuàng)建一個單文檔的應(yīng)用程序,名為:畫刷。(2)利用ClassWizard將WM_PAINT消息映射到視圖類(View)中,并添加下列代碼:voidCMyView::OnPaint(){CDC*pDC=GetDC();//獲得顯示設(shè)備環(huán)境DC的指針pDCCPennewPen;//定義畫筆對象//生成一支顏色為紅色、寬度為6個像素的實心畫筆上一頁下一頁返回5.3圖形設(shè)備接口對象newPen.CreatePen(PS_SOLID,6,RGB(255,0,0));CBrushnewBrush;//定義畫刷對象newBrush.CreateSolidBrush(RGB(0,255,0));//綠色畫刷//將創(chuàng)建的畫筆選入內(nèi)存DC,同時暫時擠出并保存原畫筆CPen*poldpen=pDC->SelectObject(&newPen);//將創(chuàng)建的畫刷選入內(nèi)存DC,同時暫時擠出并保存原畫刷CBrush*poldbrush=pDC->SelectObject(&newBrush);pDC->MoveTo(10,10);//調(diào)用MoveTo函數(shù),定點到點(10,10)pDC->LineTo(100,100);//調(diào)用LineTo函數(shù),畫線到點(100,100)//調(diào)用畫矩形函數(shù)Rectangle上一頁下一頁返回5.3圖形設(shè)備接口對象pDC->Rectangle(120,120,200,200);//恢復(fù)內(nèi)存DC中原有的畫筆pDC->SelectObject(poldpen);//恢復(fù)內(nèi)存DC中原有的畫刷pDC->SelectObject(poldbrush);//釋放顯示DCReleaseDC(pDC);}(3)編譯運行,結(jié)果如圖5.8

所示。畫刷的屬性通常包括填充色、填充圖案和填充樣式3種。畫刷的填充色和畫筆顏色一樣,都是使用COLORREF顏色類型,畫刷的填充圖案通常是用戶定義的8×8位圖,而填充樣式往往是CDC內(nèi)部定義的一些特性,它們都是以HS_為前綴的標(biāo)識,如表5.4

所示。上一頁返回5.4顏色和顏色對話框一個彩色像素的顯示需要顏色空間支持,MFC中的CDC類使用的是RGB顏色空間,即選用紅(R)、綠(G)、藍(lán)(B)3種基色分量,通過對這3種基色不同比例的混合,可以得到不同彩色效果。在MFC中使用COLORREF數(shù)據(jù)類型來表示一個32位的RGB顏色,它可以用16進(jìn)制表示OxOObbggrr。其中:rr,gg,bb分別表示紅、綠、藍(lán)各種顏色分量的16進(jìn)制值,最大為Oxff。在具體操作RGB顏色時,還可使用下列宏操作。GetBValue:獲得32位RGB顏色值中的藍(lán)色分量。GetGValue:獲得32位RGB顏色值中的綠色分量。GetRValue:獲得32位RGB顏色值中的紅色分量。RGB:將指定的R、G、B分量值轉(zhuǎn)換成一個32位的RGB顏色值。下一頁返回5.4顏色和顏色對話框MFC的CColorDialog類為應(yīng)用程序提供了“顏色”對話框,如圖5.9

所示。CColorDialog類具有下列的構(gòu)造函數(shù):CColorDialog(COLORREFclrInit=0,DWORDdwFlags=0,CWnd*pParentWnd=NULL);參數(shù):①clrInit用于指定選擇的默認(rèn)顏色值,若此值沒有指定,則為RGB(0,0,0)(黑色)。②pParentWnd用于指定對話框的父窗口指針。③dwFlags用于表示定制對話框外觀和功能的系列標(biāo)志參數(shù),它可以是下列值之一或組合。上一頁下一頁返回5.4顏色和顏色對話框CC_ANYCOLOR:在基本顏色單元中列出所有可得到的顏色。CC_FULLOOEN:顯示所有的顏色對話框界面。若此標(biāo)志沒有被設(shè)定,則用戶單擊“規(guī)定自定義顏色”按鈕才能顯示出定制顏色界面。CC_PREVENTFULLOPEN:禁用“規(guī)定自定義顏色”按鈕。CC_SHOWHELP:在對話框中顯示“幫助”按鈕。CC_SOLIDCOLOR:在基本顏色單元中只列出所得到的純色。當(dāng)對話框“OK”退出(即DoModal返回IDOK)時,可調(diào)用下列成員獲得相應(yīng)的顏色。COLORREFGetColor()const;//返回用戶選擇的顏色voidSetCurrentColor(COLORREFclr);//強制使用clr作為當(dāng)前選擇的顏色上一頁下一頁返回5.4顏色和顏色對話框staticCOLORREF*GetSavedCustomColors();//返回用戶自己定義的顏色[例5.7]使用顏色對話框,可在窗口中隨意畫圖、更改顏色及畫筆寬度、填充顏色等。如何進(jìn)行顏色選取,MFC為用戶封裝了一個名為CColorDialog的類,這個類將使用戶輕松地完成顏色選取,彈出“顏色”對話框,“自定義顏色”等。(1)建一個單文檔(SDI)應(yīng)用程序,名為:工具條繪圖。(2)在“查看”的下面建菜單,ID為“ID_COLORS_MENU”,標(biāo)題為:畫筆(&H)。(3)加工具條及工具條按鈕,樣式如圖5.10所示。上一頁下一頁返回5.4顏色和顏色對話框ResourceView→右鍵單擊Toolbar→Insert→Toolbar→New命令,將此工具條本身的ID改為“IDR_MYTOOLBAR”,右邊工具條上出現(xiàn)一個按鈕,雙擊這個按鈕,將其ID改為“ID_BUTTONRED”,之后用畫刷將其涂成紅色。再逐個雙擊后面出現(xiàn)的空白按鈕,將它們的ID改為:ID_BUTTONGREEN(用畫刷涂成綠色)ID_BUTTONBLUE(用畫刷涂成藍(lán)色)ID_BUTTONDASH(用畫筆涂成細(xì)斜杠圖形)ID_BUTTONSOLID(用畫筆涂成粗斜杠圖形)ID_BUTTONRECT(用畫筆涂成方框填充圖形)ID_BUTTONFILL(用畫筆涂成畫刷圖形)ID_BUTTON_PENCOLORS(用畫筆涂成畫筆圖形)ID_BUTTON_PENWILD(用畫筆涂成畫筆寬度圖形)上一頁下一頁返回5.4顏色和顏色對話框(4)分別加以下鼠標(biāo)映射消息(分別映射到視圖View里):WM_LBUTTONDOWN//鼠標(biāo)按下WM_MOUSEMOVE//鼠標(biāo)移動WM_LBUTTONUP//鼠標(biāo)釋放(5)自定義按鈕的消息映射函數(shù),用于選擇其中的任何一項畫圖。在視圖頭文件(View.h)消息映射區(qū)里添加:afx_msgvoidOnPenChoice(UINTnID);(6)在視圖執(zhí)行文件(View.cpp)消息映射開始處添加:ON_COMMAND_RANGE(ID_BUTTONRED,ID_BUTTON_PENWILD,OnPenChoice)上一頁下一頁返回5.4顏色和顏色對話框(7)在視圖Wiew.h頭文件的public下添加成員變量和函數(shù)。CPointStartPt,EndPt;//用于記錄畫筆的起始位置和終點位置CPenPen;//畫筆對象COLORREFm_colors;//顏色對象CRectRect;//矩形對象即窗口大小intPenStarte;//畫筆狀態(tài)DWORDPenStyle;//用于存儲畫筆風(fēng)格intMyPenWild;//用于設(shè)置畫筆的寬度voidFillMyRect();//充填顏色voidMyColorsDlg();//用以完成顏色選取對話框的實現(xiàn)voidWildDlg();//用于完成選擇畫筆寬度對話框的初始化上一頁下一頁返回5.4顏色和顏色對話框(8)在視圖View.cpp的開頭部分添加代碼:#endif#defineREDRGB(255,0,0)#defineGREENRGB(0,255,0)#defineBLUERGB(0,0,255)在下面的構(gòu)造函數(shù)里添加代碼:CMyView::CMyView():PenStarte(0)//此處的“:”表示其后面列表稱為成員初始化列表。畫筆狀態(tài)初始為0{MyPenWild=1;//用于設(shè)置畫筆的寬度,初始寬度為1PenStyle=PS_SOLID;//用于存儲畫筆風(fēng)格,初始風(fēng)格為實線,見表5.3}上一頁下一頁返回5.4顏色和顏色對話框(9)在MainFrm.h的public下添加代碼:CToolBar*m_pColorToolbar;//定義顏色工具條類指針(10)在MainFrm.cpp里的構(gòu)造函數(shù)后面添加代碼:CMainFrame::CMainFrame():m_pColorToolbar(0){//TODO:addmemberinitializationcodehere}說明:“:”表示其后面列表稱為成員初始化列表。這里表示顏色工具條類指針對象初始狀態(tài)為0。上一頁下一頁返回5.4顏色和顏色對話框(11)為該項目增加一對話框,并且進(jìn)行以下操作:1)將對話框本身的ID改為:IDD_DIALOG_WILD。2)拖過來一個編輯控件EditBox,將其ID改為:ID_EDIT_WILD。注意:屬性General里置好Visible和TabStop。3)拖來一個Spin旋轉(zhuǎn)按鈕控件放在EditBox右邊;改ID為“IDC_SPIN_WILD”。同樣置好Visible和TabStop,在Styles下Orientation(控件放置方向)欄置為Vertical(垂直),在Alignment(控件在伙伴窗口的位置安排)欄置為Right(右邊),并置好Autobuddy(自動選擇前一個窗口作為伙伴窗口)和Setbuddyinteger(使控件設(shè)置伙伴窗口,數(shù)值可為十進(jìn)制或十六進(jìn)制)及Arrowkeys(當(dāng)按下向上和向下方向鍵時,也能增加或減少)。上一頁下一頁返回5.4顏色和顏色對話框(12)給對話框加類,類名為“CPENWILDDLG”,基類為“CDialog”。(13)為對話框類上的控件加成員變量:編輯框IDC_EDIT_WILD對應(yīng)成員變量intm_penwild//整型編輯框IDC_EDIT_WILD對應(yīng)成員變量CEditm_cpenwild//控制類型旋轉(zhuǎn)按鈕IDC_SPIN_WILD對應(yīng)成員變量CSpinButtonCtrlm_cwildspin//控制類型(14)在視圖頭文件View.h里加:#include"PENWILDDLG.h"。(15)添加映射消息及代碼:1)將菜單項消息映射ID_COLORS_MENU映射在CMainFrame主框架中并添加代碼:上一頁下一頁返回5.4顏色和顏色對話框voidCMainFrame::OnColorsMenu(){if(0==m_pColorToolbar){m_pColorToolbar=newCToolBar;//為顏色工具條開辟一片單元m_pColorToolbar->Create(this);//建一個Windows工具條并將其連接到此CTollBar中m_pColorToolbar->LoadToolBar(IDR_MYTOOLBAR);//加載由資源編輯器創(chuàng)建的工具//條資源,我們建好的這個工具條m_pColorToolbar->EnableDocking(CBRS_ALIGN_ANY);DockControlBar(m_pColorToolbar);}}上一頁下一頁返回5.4顏色和顏色對話框說明:EnableDocking(CBRS_ALIGN_ANY)可使控制條停靠在父窗口的任何一邊。參數(shù):指定框架窗口的哪一邊可用作控制條的停靠點,可以是下列值中一個或多個。①CBRS_ALIGN_TOP允許停靠在客戶區(qū)的頂部。②CBRS_ALIGN_BOTTOM允許停靠在客戶區(qū)的底部。③CBRS_ALIGN_LEFT允許停靠在客戶區(qū)的左邊。④CBRS_ALIGN_RIGHT允許停靠在客戶區(qū)的右邊。⑤CBRS_ALIGN_ANY允許停靠在客戶區(qū)的任何一邊。⑥CBRS_ALIGN_MULTI允許一個小框架窗口中存在多個浮動控制條。上一頁下一頁返回5.4顏色和顏色對話框2)在主框架為ID_COLORS_MENU中加映射消息UPDATE_COMMAND_UI(命令屬性)。voidCMainFrame::OnUpdateColorsMenu(CCmdUI*pCmdUI){if(0==m_pColorToolbar)pCmdUI->SetCheck(FALSE);elseif(m_pColorToolbar->IsWindowVisible()==TRUE)pCmdUI->SetCheck(TRUE);elsepCmdUI->SetCheck(FALSE);}上一頁下一頁返回5.4顏色和顏色對話框說明:①SetCheck設(shè)置命令用戶界面元素為恰當(dāng)選擇狀態(tài),可用于工具條按鈕(不確定狀態(tài))和菜單項。參數(shù):0——即FALSE,設(shè)置為不選擇;1——即TRUE,設(shè)置為選擇;2——設(shè)置為不確定。②IsWindowVisible獲得給定窗口的可視狀態(tài)。函數(shù)原型:BOOLIsWindowVisible(HWNDhWnd);參數(shù):hWnd——被測試窗口的句柄。③CCmdUI僅用于ON_UPDATE_COMMAND(不是命令)處理函數(shù)中,一般用來設(shè)置特性等用。如pCmdUI->Enable(false);是屏蔽菜單。上一頁下一頁返回5.4顏色和顏色對話框3)為鼠標(biāo)按下映射消息(在視圖類View中)添加代碼:voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CRectr;if(PenStarte==0){StartPt.x=point.x;//起始位置的x坐標(biāo)StartPt.y=point.y;//起始位置的y坐標(biāo)}elseif(PenStarte==1){Rect.left=point.x;//窗口左x坐標(biāo)上一頁下一頁返回5.4顏色和顏色對話框Rect.top=point.y;//窗口頂y坐標(biāo)}else{}CView::OnLButtonDown(nFlags,point);}4)為鼠標(biāo)釋放映射消息(在視圖類View中)添加代碼:voidCMyView::OnLButtonUp(UINTnFlags,CPointpoint){if(PenStarte==0)//畫筆狀態(tài)為0StartPt.x=-1;//起始位置xelseif(PenStarte==1)//畫筆狀態(tài)為1上一頁下一頁返回5.4顏色和顏色對話框{Rect.right=point.x;Rect.bottom=point.y;CDC*pDC=GetDC();CPenRectPen(PS_DASH,1,m_colors);pDC->SelectObject(&RectPen);//選擇一個GDI繪圖對象pDC->MoveTo(Rect.left,Rect.top);pDC->LineTo(Rect.right,Rect.top);pDC->LineTo(Rect.right,Rect.bottom);pDC->LineTo(Rect.left,Rect.bottom);pDC->LineTo(Rect.left,Rect.top);ReleaseDC(pDC);上一頁下一頁返回5.4顏色和顏色對話框PenStarte=0;//畫筆狀態(tài)置0}CView::OnLButtonUp(nFlags,point);}說明:①GetDC:是檢索一指定窗口的客戶區(qū)域或整個屏幕的顯示設(shè)備上下文的句柄;以后可以在GDI函數(shù)中用該句柄繪圖。函數(shù)原型如下:GetDC(HWNDhWnd);參數(shù):hWnd為檢索的窗口的句柄,若為NULL,則檢索整個屏幕的設(shè)備上下文環(huán)境。上一頁下一頁返回5.4顏色和顏色對話框②CPenRectPen(PS_DASH,1,m_colors):定義畫筆對象;虛線寬度為1,含有顏色值。函數(shù)原型如下。CPen(intnPenStyle,intnWidth,COLORREFcrColor)參數(shù):nPenSyle指定畫筆風(fēng)格。nWidth指定畫筆的寬度。crColor包含畫筆的RGB顏色值。③SelectObject:將一個對象選入設(shè)備環(huán)境中,新選對象替代同一類型的先前對象,函數(shù)原型如下:CPen*SelectObjiect(CPen*pPen)參數(shù):pPen是指向一個要選擇的CPen對象的指針。上一頁下一頁返回5.4顏色和顏色對話框④MoveTo:將當(dāng)前位置移動到x和y參數(shù)(或point參數(shù)MoveTo(POINTpoint))指定的點,函數(shù)原型如下:MoveTo(intx,inty)參數(shù):x表示新位置的邏輯x坐標(biāo)。y表示新位置的邏輯y坐標(biāo)。⑤LineTo:從當(dāng)前位置到由x和y(或point)指定的端點(但不包括此端點)畫線,函數(shù)原型如下:BOOLLineTo(intx,inty)參數(shù):x表示線段端點的邏輯x坐標(biāo);y表示線段端點的邏輯y坐標(biāo);上一頁下一頁返回5.4顏色和顏色對話框⑥ReleaseDC:釋放設(shè)備上下文環(huán)境(DC)供其他應(yīng)用程序使用。函數(shù)的效果與設(shè)備上下文環(huán)境類型有關(guān)。它只釋放公用的和設(shè)備上下文環(huán)境,對于類或私有的則無效,函數(shù)原型如下:intReleaseDC(HWNDhWnd,HDChdc);參數(shù):hWnd指向要釋放的設(shè)備上下文環(huán)境所在的窗口的句柄。hdc指向要釋放的設(shè)備上下文環(huán)境的句柄。5)為鼠標(biāo)移動映射消息(在視圖類View中)添加代碼:voidCMyView::OnMouseMove(UINTnFlags,CPointpoint){CClientDCdc(this);上一頁下一頁返回5.4顏色和顏色對話框dc.SelectObject(&Pen);EndPt.x=point.x;//終點x坐標(biāo)EndPt.y=point.y;//終點y坐標(biāo)if(StartPt.x>=0)//起始x坐標(biāo)大于0{dc.MoveTo(StartPt.x,StartPt.y);//從起點畫線dc.LineTo(EndPt);//到指定的端點畫線StartPt.x=EndPt.x;//端點x再當(dāng)起點xStartPt.y=EndPt.y;//端點y再當(dāng)起點y}CView::OnMouseMove(nFlags,point);}上一頁下一頁返回5.4顏色和顏色對話框說明:CClientDCdc(this)——構(gòu)造CClientDC對象,則設(shè)備環(huán)境的映射區(qū)域限于客戶區(qū)域,不能在客戶區(qū)域外繪圖,原點(0,0)在客戶區(qū)左上角。this是一個指向CMyView對象的指針。如果創(chuàng)建CWindowDC對象,則設(shè)備環(huán)境的映射區(qū)域為整個窗口(包括標(biāo)題欄、狀態(tài)欄、窗口邊框等),原點(0,0)在整個窗口的左上角。注意:①視圖窗口沒有非客戶區(qū)域。②視圖窗口覆蓋在框架窗口之上。6)完成自定義充填函數(shù)(在視圖類View中)添加代碼(全用手寫):voidCMyView::FillMyRect(){CDC*pDC=GetDC();CBrushBrush;//畫刷上一頁下一頁返回5.4顏色和顏色對話框Brush.CreateSolidBrush(m_colors);//用指定的顏色初始化畫刷。參數(shù):畫刷顏色pDC->FillRect(&Rect,&Brush);ReleaseDC(pDC);//釋放設(shè)備上下文環(huán)境(DC)供其他應(yīng)用程序使用}說明:FillRect(&Rect,&Brush)用給定畫刷填充指定矩形,包括左邊和上部邊界,但不填充右邊和底部邊界,函數(shù)原型如下:voidFillRect(LPCRECTlpRect,CBrush*pBrush)上一頁下一頁返回5.4顏色和顏色對話框參數(shù):①lpRect指向一個RECT結(jié)構(gòu),該結(jié)構(gòu)中包含要填充矩形的邏輯坐標(biāo)可為其傳遞一個CRect對象。②pBrush標(biāo)識用于填充矩形的畫刷。7)完成自定義顏色選取對話框的實現(xiàn)(在視圖類View中)函數(shù)代碼(全用手寫):voidCMyView::MyColorsDlg(){CColorDialogdlg;//顏色對話框類對象if(IDOK==dlg.DoModal()){m_colors=dlg.GetColor();Pen.DeleteObject();//刪除GDI對象,對象使用的所有系統(tǒng)資源都會被釋放上一頁下一頁返回5.4顏色和顏色對話框Pen.CreatePen(PenStyle,1,m_colors);}}說明:①GetColor在調(diào)用DoModal函數(shù)之后調(diào)用,用以獲取用戶選中顏色的信息。返回一個COLORREF值,其中包括顏色對話框中選中的顏色RGB信息。②CreatePen(PenStyle,1,m_colors)用指定風(fēng)格、寬度和顏色初始化一支畫筆,函數(shù)原型如下:BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);上一頁下一頁返回5.4顏色和顏色對話框8)完成自定義選擇畫筆寬度對話框的初始化(在視圖類View中)函數(shù)代碼(全用手寫):voidCMyView::WildDlg(){CPENWILDDLGDlg;if(IDOK==Dlg.DoModal())MyPenWild=Dlg.m_penwild;}9)完成自定義按鈕的消息映射(在視圖類View中)函數(shù)代碼(全用手寫):voidCMyView::OnPenChioce(UINTnID){switch(nID){caseID_BUTTONRED:m_colors=RED;break;上一頁下一頁返回5.4顏色和顏色對話框caseID_BUTTONGREEN:m_colors=GREEN;break;caseID_BUTTONBLUE:m_colors=BLUE;break;caseID_BUTTONDASH:PenStyle=PS_DASH;break;caseID_BUTTONSOLID:PenStyle=PS_SOLID;break;caseID_BUTTONRECT:PenStarte=1;break;caseID_BUTTONFILL:FillMyRect();break;caseID_BUTTON_PENCOLORS:MyColorsDlg();break;caseID_BUTTON_PENWILD:WildDlg();break;}Pen.DeleteObject();Pen.CreatePen(PenStyle,MyPenWild,m_colors);}(16)編譯運行,結(jié)果如圖5.11

和圖5.12

所示。上一頁返回5.5字體CFont類CFont對象封裝了一種WindowsGDI字體,并且提供了用于操作CFont對象的若干方法。CFont類用來決定繪圖文本的字體,必須先創(chuàng)建字體,然后將其選進(jìn)要進(jìn)行文本輸出的DC,就可以利用文本輸出函數(shù)顯示該字體形式的文本內(nèi)容了。創(chuàng)建字體由以下2步完成:(1)定義一個CFont類的對象,應(yīng)用程序框架會調(diào)用構(gòu)造函數(shù),如CFontmyFont。(2)調(diào)用CFont類,創(chuàng)建字體函數(shù),從而將CFont對象與Windows的某種字體相關(guān)聯(lián)。[例5.8]字體顯示。(1)創(chuàng)建一個單文檔應(yīng)用程序,名為:字體顯示。下一頁返回5.5字體CFont類(2)在視圖類的實現(xiàn)文件(View.cpp)的OnDraw函數(shù)中,添加下列代碼:voidCMyView::OnDraw(CDC*pDC){……pDC->SetBkColor(RGB(240,240,250));//設(shè)置背景顏色pDC->SetTextColor(RGB(255,0,0));//設(shè)置文本顏色intny=260;intndl=40;for(inti=32;i>=20;i-=4){FontOut(pDC,ny,i,ndl);ndl+=300;}}上一頁下一頁返回5.5字體CFont類(3)添加自定義函數(shù)FontOut()。單擊ClassView打開項目工作區(qū),右鍵單擊CMyView,在彈出的快捷菜單中選擇AddMemberFunction,添加一個類型為void、名為FontOut(CDC*pDC,int&nHeight,intnPoints,intdline)的自定義函數(shù)。(4)在FontOut(CDC*pDC,int&nHeight,intnPoints,intdline)函數(shù)中添加代碼:voidCMyView::FontOut(CDC*pDC,int&nHeight,intnPoints,intdline){TEXTMETRICtextM;//定義文本結(jié)構(gòu)TEXTMETRIC變量CFontfont;//定義CFont類對象CStringstr;//創(chuàng)建字體上一頁下一頁返回5.5字體CFont類font.CreateFont(-nPoints,0,dline,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"宋體");//將創(chuàng)建的字體選入內(nèi)存DC,同時暫時擠出并保存原字體CFont*poldfont=(CFont*)pDC->SelectObject(&font);pDC->GetTextMetrics(&textM);//獲取文本信息str.Format("這是%d點陣宋體字",nPoints);pDC->TextOut(20,nHeight,str);上一頁下一頁返回5.5字體CFont類nHeight-=textM.tmHeight+textM.tmExternalLeading;pDC->SelectObject(poldfont);//恢復(fù)內(nèi)存DC中原有的字體}(5)編譯運行,結(jié)果如圖5.13

所示。1.字體的屬性和創(chuàng)建字體的屬性有很多,但其主要屬性有3個:字樣、風(fēng)格、尺寸。字樣:字符書寫和顯示時表現(xiàn)出的特定模式,如漢字的宋體、楷體、仿宋、黑體、隸書、幼圓等多種字樣。風(fēng)格:主要表現(xiàn)為字體粗細(xì)和是否傾斜等特點。上一頁下一頁返回5.5字體CFont類尺寸:用于指定字符所占區(qū)域的大小,通常用字符高度來描述,可以取mm或英寸①作為單位,但為了直觀起見,也常常采用一種稱為“點”的單位,一點約折合為1/72英寸。為方便用戶創(chuàng)建字體,系統(tǒng)定義一種“邏輯字體”,它是應(yīng)用程序?qū)τ诶硐胱煮w的一種描述方式。在使用邏輯字體繪制文字時,系統(tǒng)會采用一種特定算法把邏輯字體映射為最匹配的物理字體(實際安裝在操作系統(tǒng)中的字體)。邏輯字體的具體屬性可由LOGFONT結(jié)構(gòu)來描述,下面列出最常用的結(jié)構(gòu)成員。typedefstructtagLOGFONT{LONGifHeight,//字符的邏輯高度LONGifWidth,//字符的平均邏輯寬度LONGifEscapement,//文本行角度上一頁下一頁返回5.5字體CFont類LONGifOrientation,//字符的角度LONGifWeight,//字體的粗細(xì)度BYTEifItalic,//斜體標(biāo)志BYTEifUnderline,//下劃線標(biāo)志BYTEifStrikeOut,//刪除線標(biāo)志BYTEifCharSet,//字符集,漢字必須為GB2312_CHARSETBYTEnOutPrecision,//字體輸出的結(jié)果和要求的匹配程度BYTEnClipPrecision,//如何剪裁落于剪裁區(qū)之外的字符BYTEnOuality,//字體屬性匹配的精確度BYTEnPitchAndFamily,//字體間距和字體族上一頁下一頁返回5.5字體CFont類TCHARifFaceName[LF_FACESIZE],//字樣名稱//……}LOGFONT;說明:(1)在結(jié)構(gòu)成員中ifHeight表示字符的邏輯高度,這里的高度是字符的純高度。當(dāng)此值>0時,系統(tǒng)將此值映射為實際字體單元格的高度;當(dāng)此值=0時,系統(tǒng)將使用默認(rèn)的值;當(dāng)此值<0時,系統(tǒng)將此值映射為實際的字體高度。(2)ifEscapement表示字體的傾斜矢量與設(shè)備的x軸之間的夾角(以1/10度為計量單位),該傾斜矢量與文本的書寫方向是平行的。上一頁下一頁返回5.5字體CFont類(3)ifOrientation表示字符基準(zhǔn)線與設(shè)備的x軸之間的夾角(以1/10度為計量單位)。(4)ifWeight表示字體的粗細(xì)程度,取值范圍是從0~1000(字符筆畫從細(xì)到粗)。例如400為常規(guī)情況,700為粗體。根據(jù)定義的邏輯字體,用戶可以調(diào)用CFont類的CreateFontIndirect函數(shù)創(chuàng)建文本輸出所需要的字體。下例中的邏輯字體創(chuàng)建是利用CreateFont()函數(shù)實現(xiàn)的,函數(shù)原型如下:BOOLCreateFont(intnHeight,//字體的邏輯高度,0代表默認(rèn)值intnWidth,//字體的平均邏輯寬度,0代表默認(rèn)值intnEscapement,//傾斜角度上一頁下一頁返回5.5字體CFont類intnOrientation,//字體朝向角度intfnWeight,//字體的權(quán)重DWORDfdwItalic,//是否為斜體DWORDfdwUnderline,//是否有下劃線DWORDfdwStrikeOut,//字體是否凸出DWORDfdwCharSet,//字體所屬字符集,默認(rèn)為DEFAULT_GHARSETDWORDfdwOutputPrecision,//輸出精度,通常為OUT_DEFAULT_PRECISDWORDfdwClipPrecision,//顯示精度DWORDfdwQuality,//輸出質(zhì)量,通常為DEFAULT_QUALITY上一頁下一頁返回5.5字體CFont類DWORDfdwPitchAndFamily,//選擇的字符集LPCTSTRlpszFace//字符體名稱的字符串);[例5.9]設(shè)計不同大小字體并輸出。(1)建一個單文檔的應(yīng)用程序,名為:創(chuàng)建字體。(2)在視圖類View.cpp的OnDraw函數(shù)中添加如下代碼:voidCMyView::OnDraw(CDC*pDC){……intcHeight;UINTposition=0;for(UINTx=0;x<6;x++)上一頁下一頁返回5.5字體CFont類{CFontfont;cHeight=16+x*8;font.CreateFont(-cHeight,//字體高度,小于0時轉(zhuǎn)換為設(shè)備單位,絕對值與可用字體的字符高度匹配,大于0時轉(zhuǎn)換為設(shè)備單位匹配可用字體的單元高度,等于0時使用一種合理的默認(rèn)大小0,//字符平均寬度取默認(rèn)值0,//文本行角度為0,水平0,//字符角度為0,正立FW_NORMAL,//正常字體FALSE,//不傾斜FALSE,//不加下劃線上一頁下一頁返回5.5字體CFont類FALSE,//不加刪除線ANSI_CHARSET,//字符集OUT_DEFAULT_PRECIS,//輸出精度CLIP_DEFAULT_PRECIS,//顯示精度DEFAULT_QUALITY,//輸出質(zhì)量DEFAULT_PITCH|FF_MODERN,//選擇的字符集//字符體名稱的字符串,TimesNewRoman為一種優(yōu)秀的電腦字型"TimesNewRoman");CFont*oldFont=pDC->SelectObject(&font);上一頁下一頁返回5.5字體CFont類position+=cHeight;pDC->TextOut(20,position,"時代先鋒");pDC->SelectObject(oldFont);}}(3)編譯運行,結(jié)果如圖5.14

所示。上一頁下一頁返回5.5字體CFont類2.使用字體對話框CFontDialog類為用戶提供了字體及其文本顏色選擇的“字體”對話框,如圖5.15

所示。它的構(gòu)造函數(shù)如下:CFontDialog(LPLOGFONTlplfInitial=NULL,DWORDdwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);參數(shù):①lplfInitial是一個LOGFONT結(jié)構(gòu)指針,用于設(shè)置對話框最初的字體特性。②dwFlags指定選擇字體的標(biāo)志。上一頁下一頁返回5.5字體CFont類③pdcPrinter用于表示打印設(shè)備環(huán)境指針。④pParentWnd用于表示對窗口的父窗口指針,當(dāng)字體對話框DoModal返回IDOK后,可使用下列的成員函數(shù)。voidGetCurrentFont(LPLOGFONTlplf);//返回用戶選擇的LOGFONT字體CStringGetFaceName()const;//返回用戶選擇的字體名稱CStringGetStyleName()const;//返回用戶選擇的字體樣式名稱intGetSize()const;//返回用戶選擇的字體大小COLORREFGetColor()const;//返回用戶選擇的文本顏色intGetWeight()const;//返回用戶選擇的字體粗細(xì)程度BOOLIsStrikeOut()const;//判斷是否有刪除線上一頁下一頁返回5.5字體CFont類BOOLIsUnderline()const;//判斷是否有下畫線BOOLIsBold()const;//判斷是否是粗體BOOLIsItalic();//判斷是否是斜體[例5.10]顯示文檔內(nèi)容并使用字體對話框改變顯示的字體大小。(1)用MFCAppWizard創(chuàng)建單文檔應(yīng)用程序,名為:設(shè)置字體。在創(chuàng)建的第6步將視圖的基類選擇為CScrollView。由于視圖客戶區(qū)往往顯示不了文檔的全部內(nèi)容,因此需要視圖支持滾動操作。(2)在文檔類CMyDoc.h文件的public下添加:CStringArraym_strContents;//用來將讀取的文檔內(nèi)容保存。(3)在CMyDoc.cpp的CMyDoc::Serialize函數(shù)中添加讀取文檔內(nèi)容的代碼:voidCMyDoc::Serialize(CArchive&ar)上一頁下一頁返回5.5字體CFont類{……else{CStringstr;m_strContents.RemoveAll();while(ar.ReadString(str)){m_strContents.Add(str);}}}(4)在視圖類CMyView.h文件中添加成員變量(public下):LOGFONTm_lfText;//用來保存當(dāng)前所使用的邏輯字體上一頁下一頁返回5.5字體CFont類(5)在視圖類的實現(xiàn)文件CMyView.cpp的構(gòu)造函數(shù)中添加m_lfText的初始化代碼:CMyView::CMyView(){memset(&m_lfText,0,sizeof(LOGFONT));m_lfText.lfHeight=-12;m_lfText.lfCharSet=GB2312_CHARSET;strcpy(m_lfText.lfFaceName,"宋體");}上一頁下一頁返回5.5字體CFont類(6)用MFCClassWizard為視圖類(CMyView)添加WM_LBUTTONDBLCLK(雙擊鼠標(biāo))的消息映射函數(shù),并添加代碼:voidCMyView::OnLButtonDblClk(UINTnFlags,CPointpoint){CFontDialogdlg(&m_lfText);if(dlg.DoModal()==IDOK){dlg.GetCurrentFont(&m_lfText);Invalidate();}CScrollView::OnLButtonDblClk(nFlags,point);}上一頁下一頁返回5.5字體CFont類(6)用MFCClassWizard為視圖類(CMyView)添加WM_LBUTTONDBLCLK(雙擊鼠標(biāo))的消息映射函數(shù),并添加代碼:voidCMyView::OnLButtonDblClk(UINTnFlags,CPointpoint){CFontDialogdlg(&m_lfText);if(dlg.DoModal()==IDOK){dlg.GetCurrentFont(&m_lfText);Invalidate();}CScrollView::OnLButtonDblClk(nFlags,point);}至此,當(dāng)雙擊鼠標(biāo)左鍵后,就會彈出“字體”對話框,從中可改變字體的屬性。單擊“確定”按鈕后,程序就執(zhí)行CMyView::OnDraw函數(shù)中的代碼。上一頁下一頁返回5.5字體CFont類(7)在視圖類執(zhí)行文件CMyView.cpp的OnDraw函數(shù)中添加下列代碼:voidCMyView::OnDraw(CDC*pDC){……//創(chuàng)建字體CFontcf;cf.CreateFontIndirect(&m_lfText);CFont*oldFont=pDC->SelectObject(&cf);//計算每行的高度TEXTMETRICtm;pDC->GetTextMetrics(&tm);上一頁下一頁返回5.5字體CFont類intlineHeight=tm.tmHeight+tm.tmExternalLeading;inty=0;inttab=tm.tmAveCharWidth*4;//一個TAB設(shè)置4個字符//輸出并計算行的最大長度intlineMaxWidth=0;CStringstr;CSizelineSize(0,0);for(inti=0;i<pDoc->m_strContents.GetSize();i++){str=pDoc->m_strContents.GetAt(i);上一頁下一頁返回5.5字體CFont類pDC->TabbedTextOut(0,y,str,1,&tab,0);str=str+"A";//多計算一個字符寬度lineSize=pDC->GetTabbedTextExtent(str,1,&tab);if(lineMaxWidth<lineSize.cx)lineMaxWidth=lineSize.cx;y+=lineHeight;}pDC->SelectObject(oldFont);//下面一條語句是多算一行,以便滾動窗口能顯示全部文檔內(nèi)容intnLines=pDoc->m_strContents.GetSize()+1;CSizesizeTotal;上一頁下一頁返回5.5字體CFont類sizeTotal.cx=lineMaxWidth;sizeTotal.cy=lineHeight*nLines;SetScrollSizes(MM_TEXT,sizeTotal);//設(shè)置滾動邏輯窗口大小}(8)編譯運行,打開任意一個文本文件,左鍵雙擊文檔窗口任意一點,出現(xiàn)字體對話框,可從中設(shè)置被顯示的字體大小。結(jié)果如圖5.16

所示。上一頁返回5.6位圖、圖標(biāo)5.6.1位圖Windows的位圖有兩種類型:一種是GDI位圖,另一種是DIB位圖。GDI位圖是由MFC中的CBitmap類來表示的,是與設(shè)備有關(guān)的位圖。DIB是與設(shè)備無關(guān)的位圖,它自帶顏色,任何運行Windows的機器都可以處理DIB,比GDI優(yōu)越得多。CBitmap類封裝了Windows的GDI位圖操作所需的大部分函數(shù),其中LoadBitmap是位圖的初始化函數(shù),其函數(shù)原型如下:BOOLLoadBitmap(LPCTSTRlpszResourceName);BOOLLoadBitmap(UINTnIDResource);下一頁返回5.6位圖、圖標(biāo)該函數(shù)從應(yīng)用程序中調(diào)入一個位圖資源(由nIDResource或lpszResourceName指定)。若用戶直接創(chuàng)建一個位圖對象,可使用CBitmap類中的CreateBitmap、CreateBitmapIndirect以及CreateCompatibleBitmap函數(shù),其原型如下:BOOLCreateBitmap(intnWidth,intnHeight,UINTnPlanes,UINTnBitcount,Constvoid*lpBits);該函數(shù)從應(yīng)用程序中調(diào)用一個位圖資源(由nIDResource或lpszResourceName指定)。若用戶直接創(chuàng)建一個位圖對象,可使用CBitmap類的CreateBitmap、CreateBitmapIndirect以及CreateCompatibleBitmap函數(shù),其原型如下:BOOLCreateBitmap(intnWidth,intnHeight,UINTnPlanes,UINTnBitcount,Constvoid*lpBits);上一頁下一頁返回5.6位圖、圖標(biāo)此函數(shù)用指定的寬度(nWidth)、高度(nHeight)和位模式創(chuàng)建一個位圖對象。參數(shù):①nPlanes表示位圖的顏色位的數(shù)目。②nBitcount表示每個像素的顏色位個數(shù)。③lpBits表示包含位值的短整型數(shù)組。若此數(shù)組為NULL則位圖對象還未初始化。“BOOLCreateBitmapIndirect(LPBITMAPlpBitmap);”:此函數(shù)直接用BITMAP結(jié)構(gòu)來創(chuàng)建一個位圖對象。“BOOLCreateCompatibleBitmap(CDC*Pdc,intnWidth,intnHeight);”:此函數(shù)為某設(shè)備環(huán)境創(chuàng)建一個指定的寬度(nWidth)和高度(nHeight)的位圖對象。由于位圖不能直接顯示在實際設(shè)備中,因此對于GDI位圖的顯示則必須遵循下列步驟:上一頁下一頁返回5.6位圖、圖標(biāo)(1)調(diào)用CBitmap類的CreateBitmap、CreateCompatibleBitmap以及CreateBitmapIndirect函數(shù)創(chuàng)建一個適當(dāng)?shù)奈粓D對象。(2)調(diào)用CDC::CreateCompatibleDC函數(shù)創(chuàng)建一個內(nèi)存環(huán)境,以便位圖在內(nèi)存中保存下來,并與指定設(shè)備(窗口設(shè)備)環(huán)境相兼容。(3)調(diào)用CDC::SelectObject函數(shù)將位圖對象選入內(nèi)存設(shè)備環(huán)境中。(4)調(diào)用CD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論