《Visual C++ 6.0程序設(shè)計(jì)》課件第8章_第1頁
《Visual C++ 6.0程序設(shè)計(jì)》課件第8章_第2頁
《Visual C++ 6.0程序設(shè)計(jì)》課件第8章_第3頁
《Visual C++ 6.0程序設(shè)計(jì)》課件第8章_第4頁
《Visual C++ 6.0程序設(shè)計(jì)》課件第8章_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章繪圖8.1綜述8.2繪圖實(shí)例思考題

8.1綜述

在應(yīng)用程序中,為了使用戶界面更加美觀、生動(dòng)或者需要用戶手動(dòng)在客戶區(qū)生成圖像,都要用到繪圖。Windows的GDI(設(shè)備圖形接口)提供了繪圖的基本工具,如畫點(diǎn)、線、多邊形、位圖以及文本輸出等。MFC的設(shè)備環(huán)境類CDC封裝了全部的繪圖函數(shù),使得繪制的圖形既可以顯示,又可以打印。在MFC中,用視圖類Cview成員函數(shù)OnDraw()來完成圖形與文本的顯示,用CWnd類的成員函數(shù)OnPaint()重繪窗口。8.1.1設(shè)備環(huán)境和CDC類

1.設(shè)備環(huán)境

在Windows顯示工作室基于設(shè)備環(huán)境(DC,DevieceContext),它是一種數(shù)據(jù)結(jié)構(gòu)。當(dāng)想要在窗口的工作區(qū)中繪制圖形,或者將工作區(qū)中的數(shù)據(jù)打印出來時(shí),都必須先獲得一個(gè)設(shè)備環(huán)境。設(shè)備環(huán)境中所謂的“設(shè)備”,泛指各種與數(shù)據(jù)輸出有關(guān)的設(shè)備,如打印機(jī)、屏幕等,以及各種特定形式的文件,如BMP文件。而“環(huán)境”一詞,指將輸出到設(shè)備的相關(guān)數(shù)據(jù)。當(dāng)需要將建立的數(shù)據(jù)輸出到設(shè)備時(shí),就需要為這個(gè)設(shè)備準(zhǔn)備一個(gè)DC,以便存儲(chǔ)想要輸出的數(shù)據(jù),而這些數(shù)據(jù)就是GDI函數(shù)繪圖的結(jié)果。因此,設(shè)備環(huán)境(DC)是應(yīng)用程序與設(shè)備驅(qū)動(dòng)程序和輸出設(shè)備之間的連接橋梁。從Windows程序開始,經(jīng)過適當(dāng)?shù)脑O(shè)備驅(qū)動(dòng)程序,最后到達(dá)窗口客戶區(qū)。設(shè)備環(huán)境還完全定義了設(shè)備驅(qū)動(dòng)程序的狀態(tài)。在應(yīng)用程序向窗口客戶區(qū)輸出信息之前,必須先獲得一個(gè)設(shè)備描述表。如果沒有,則應(yīng)用程序和窗口間就無法建立聯(lián)系。

在應(yīng)用程序中,設(shè)備環(huán)境的各種特性和方法封裝在CDC(設(shè)備環(huán)境類)中。CDC類是應(yīng)用程序關(guān)于繪圖類的基類。MFC庫從CDC類派生出幾個(gè)具體的設(shè)備描述表類,它們是CClientDC,CPaintDC,CWindowDC。任何一個(gè)具體的繪圖操作都要用他們中的一個(gè)聲明設(shè)備對(duì)象,才能進(jìn)行繪圖操作。有關(guān)設(shè)備環(huán)境有三個(gè)直接相關(guān)的類CDC、CPaintDC、CclienDC,類CDC是在MFC中創(chuàng)建設(shè)備上下文對(duì)象的基類,CDC、CGdiObject類的繼承關(guān)系如圖8-1所示。圖8-1CDC、CgdiObject類的繼承關(guān)系

2.CDC類

1)設(shè)備環(huán)境CDC類

基于MFC的Windows編程中總是選擇一個(gè)MFC類對(duì)設(shè)備環(huán)境進(jìn)行訪問。?MFC提供集中不同的設(shè)備環(huán)境類,CDC是設(shè)備環(huán)境的基類?;惡团缮愔挥袠?gòu)造函數(shù)和析構(gòu)函數(shù)不同。

(1)CClientDC類:只能在窗口的用戶區(qū)繪圖。用戶區(qū)指窗口區(qū)域中除去邊框、標(biāo)題欄、菜單欄、狀態(tài)欄等以外的部分。坐標(biāo)(0,0)通常指用戶區(qū)的左上角。如果使用CClientDC在視圖中繪圖,繪圖區(qū)域不包括文檔窗口的邊框、標(biāo)題欄、菜單欄、狀態(tài)欄;如果在對(duì)話窗口中繪圖,繪圖區(qū)域不包括對(duì)話框的邊框和標(biāo)題條。在使用CClientDC繪圖時(shí),通常先調(diào)用窗口的GetClientRect()來獲取用戶區(qū)的大小。

(2)CPaintDC類:往往在OnPaint()函數(shù)中使用。OnPaint()函數(shù)首先構(gòu)造一個(gè)CpaintDC對(duì)象,再調(diào)用OnPrepareDC()函數(shù)將其準(zhǔn)備好,最后以這個(gè)準(zhǔn)備好的CpaintDC對(duì)象指針為參數(shù),來調(diào)用OnDraw()函數(shù)進(jìn)行繪圖。

2)設(shè)備環(huán)境類CDC的常用函數(shù)介紹

設(shè)備環(huán)境類CDC的內(nèi)容十分豐富,涵蓋了有關(guān)繪圖的各個(gè)方面。如:繪圖狀態(tài)管理包括背景色、前景色、線寬、線型、填充模式、字體、字號(hào)等。MFC中的繪圖操作都封裝在CDC中,其中有像素操作、填充操作、畫線操作、畫矩形、畫圓形、畫橢圓操作、位圖操作等,另外還有字符顯示、區(qū)域的運(yùn)算及操作等。

常用的CDC函數(shù)如表8-1所示。表8-1常用CDC函數(shù)8.1.2GDI對(duì)象

在Windows應(yīng)用程序中,繪圖工作是由WindowsAPI中的GDI函數(shù)來完成的。GDI是GraphicsDeviceInterface的縮寫,含義是圖形設(shè)備接口,它的主要任務(wù)是負(fù)責(zé)系統(tǒng)與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。

在Windows操作系統(tǒng)下,絕大多數(shù)具備圖形界面的應(yīng)用程序都離不開GDI,我們利用GDI所提供的眾多函數(shù)就可以方便地在屏幕、打印機(jī)及其他輸出設(shè)備上輸出圖形、文本等操作。GDI的出現(xiàn)使程序員無需關(guān)心硬件設(shè)備及設(shè)備驅(qū)動(dòng),就可以將應(yīng)用程序的輸出轉(zhuǎn)化為硬件設(shè)備上的輸出,實(shí)現(xiàn)了程序開發(fā)者與硬件設(shè)備的隔離,大大方便了開發(fā)工作。

MFC提供了5種GDI類,他們分別是CBitmap、CPen、CBrush、CFont、CRgn以及CPalette。他們都派生于CGdiObject類,如圖8-2所示。

5種GDI類分別說明如下。

CBitmap:用于建立操作位圖的對(duì)象;

CPen:用于建立操作畫筆的對(duì)象;

CBrush:用于建立操作畫刷的對(duì)象;

CFont:用于建立操作文字的對(duì)象;

CRgn:用于建立操作繪制圖形的對(duì)象;

CPalette:用于建立操作調(diào)色盤的對(duì)象。圖8-2MFC提供的5種GDI類

1.CPen類

在Windows中提供了畫筆(pen)和畫刷(brush)兩種常用的畫圖筆工具。畫圖影響畫線的方式,包括直線、曲線和封閉曲線(如矩形和橢圓),畫筆用于繪制直線和圖形的外框,本質(zhì)上就是畫線。與線段有關(guān)的參數(shù)包含:線段風(fēng)格、線寬和線色。這些都封裝在CPen類中。

1)畫筆的創(chuàng)建

創(chuàng)建一個(gè)畫筆可以用CPen類的CreatePen函數(shù),其原型為:

BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);

其中:

(1)參數(shù)nPenStyle用于指定畫筆的風(fēng)格,其可取值如表8-2所示。表8-2nPenStyle畫筆風(fēng)格

(2)參數(shù)nWidth用于指定畫筆的寬度。

(3)參數(shù)crColr用于指定畫筆的顏色。

應(yīng)該注意的是,顏色參數(shù)用RGB宏來定義。RGB宏的定義為:

COLORREFRGB(BYTEbRed,BYTEbGreen,BYTEbBlue)

(1)參數(shù)bRed:定義紅色強(qiáng)度,其值為0~255。

(2)參數(shù)bGreen:定義綠色強(qiáng)度,其值為0~255。

(3)參數(shù)bBlue:定義藍(lán)色強(qiáng)度,其值為0~255。

在實(shí)際使用中,畫筆的創(chuàng)建也可以直接在畫筆的構(gòu)造函數(shù)中進(jìn)行,其原型為:

CPen::CPen(intnPenStyle,intnWidth,COLORREFcrColor)

2)畫筆的創(chuàng)建步驟

可以按照下述步驟創(chuàng)建一支新的畫筆:

(1)生成畫筆的一個(gè)實(shí)例(從Cpen類派生)Pen。

(2)初始化畫筆,使用CreatePen()函數(shù)。

(3)裝載畫筆,使用SelectObject()函數(shù),定義如下:

Cpen*SelectObject(Cpen*pPen);

其中pPen是畫筆對(duì)象的指針。SelectObject()返回上次所裝載的畫筆指針,以便使用結(jié)束后恢復(fù)原來的畫筆。

2.Cbrush類

畫刷的功能是填充一定的區(qū)域。畫刷的屬性通常包括填充色、填充圖案和填充樣式。

1)畫刷的創(chuàng)建

畫刷的建立同樣也可以在畫刷的構(gòu)造函數(shù)中進(jìn)行。建立的方法有4種:

CBrush::CBrush()

CBrush::CBrush(COLORREFcrColor)

CBrush::CBrush(intnIndex,COLORREFcrColor)

CBrush::CBrush(CBitmap*pBitmap)

第一種用于建立空白的畫刷;第二種建立具有某種指定顏色的畫刷;第三種建立一個(gè)特殊樣式填充的畫刷;第四鐘建立自定義樣式的畫刷。

(1)參數(shù)crColor指定填充的顏色。

(2)參數(shù)nIndex指定特殊樣式的畫刷,其可選參數(shù)如表8-3所示。

(3)參數(shù)pBitmap指定填充顏色的位圖,其大小為8×8,單位為像素。

2)畫刷的創(chuàng)建步驟

(1)使用CBrush類創(chuàng)建一個(gè)畫刷實(shí)例。

(2)生成畫刷,調(diào)用函數(shù)SelectObject(),其格式如下:

Cbrush*SelectObject(Cbrush*pBrush);

其中,pBrush是畫刷對(duì)象的指針。SelectObject()返回上次所裝載畫刷的指針,應(yīng)該保存該指針,以便使用結(jié)束后恢復(fù)原來的畫刷。

3.CFont類

CFont類用來提供各種風(fēng)格及大小的字體輸出,封裝了CDC顯示字符使用的字庫的處理方法。如果要使用CFont對(duì)象,首先要構(gòu)造一個(gè)CFont對(duì)象,然后使用成員函數(shù)CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect把該對(duì)象與Windows字體相連,這樣用戶便可以使用該對(duì)象的成員函數(shù)來操縱字體。

該類只有一個(gè)構(gòu)造函數(shù)CFont(),構(gòu)造完對(duì)象后,還不能馬上使用,應(yīng)該調(diào)用CreateFont、CreateFontIndirect、CreatePointFont或CreatePointFontIndirect進(jìn)行初始化,以便確定字體對(duì)象的參數(shù)。

CFont類封裝了一個(gè)字體數(shù)據(jù)結(jié)構(gòu)LOGFONT,yogLOGFONT結(jié)構(gòu)初始化一個(gè)CFont對(duì)象,LOGFONT的數(shù)據(jù)結(jié)構(gòu)及i如下:

typedefstructuretagGOGFONT{

LONGlfHeight; //字符的平均邏輯寬度

LONGlfEscapement; //傾角

LONGlfOrientation; //書寫方向

LONGlfWeight; //字體的粗細(xì)程度

BYTElfItalic; //斜體標(biāo)志

BYTElfUnderline; //下劃線標(biāo)志

BYTElfStrikeOut; //刪除線標(biāo)志

BYTElfCharSet;

//字符集,漢字必須為GB2312CHARSET

BYTElfOutPrecision; //字符輸出精度

BYTElfClipPrecision; //裁剪精度

BYTElfQuality; //邏輯字體與物理字體的相似程度

BYTElfPitchAndFamily;//字符的間隔和字體的相似程度

TCHARlfFaceName[LF_FACESIZE];//字樣名稱

}LOGFONT;

當(dāng)產(chǎn)生一個(gè)CFont的對(duì)象后,必須調(diào)用函數(shù)CreateFont來選擇一種字體。該成員函數(shù)的圖形聲明如下。

BOOLCreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbItalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRlpszFaceName);參數(shù)說明如下。

(1)?nHeigh:?jiǎn)挝欢攘康淖煮w高度。

(2)?nEscapement:邏輯單位度量的字體的平均寬度。

(3)?nEscapement:字體標(biāo)注逆時(shí)針方向的旋轉(zhuǎn)角度。

(4)?nOrientation:角度。

(5)?nWeight:字體的粗細(xì)程度。

(6)?bItalic:字體是否為斜體。

(7)?bUnderline:字體是否有下劃線。

(8)?cStrikeOut:字體是否被穿透。

(9)?nCharSet:指出字體的字符集,一共有以下五種字符集。

ANSI_CHARSET

DEFAULT_CHARSET

SYMBOL_CHARSET

SHIFTJIS_CHARSET

OEM_CHARSET

(10)?nOutPrecision:指出所要求的裁剪精度,該精度確定了輸出與所要求的字體高度、寬度、控制、字符方位及間距的匹配和接近程度,一般取下列值之一。

OUT_CHARACTER_PRECIS

OUT_DEFAULT_PRECIS

OUT_DEVICE_PRECIS

OUT_RASTER_PRECIS

OUT_STRING_PRECIS

OUT_STROKE_PRECIS

OUT_TT_PRECIS

(11)?nClipPrecision:指定所要求的裁剪精度。該參數(shù)說明怎樣裁剪位于裁剪區(qū)之外的部分字體。

(12)?nPitchAndFamily:字體的間距和所屬的族。

(13)?lpszFacename:一個(gè)指向ASZⅡZ字符串的指針,該字符串確定目標(biāo)字體的字型名。8.1.3繪圖相關(guān)函數(shù)介紹

1.CPoint類

CPoint類封裝了一個(gè)點(diǎn)的坐標(biāo),它是從POINT結(jié)構(gòu)派生而來的。結(jié)構(gòu)POINT的定義如下:

TypedefstructagPOINT

{

LONGx;

LONGy;

}POINT,*PPOINT;

CPoint類也繼承了POINT結(jié)構(gòu)的數(shù)據(jù)成員x和y。CPoint對(duì)象可以用在任何使用POINT結(jié)構(gòu)的場(chǎng)合。其構(gòu)造函數(shù)形式較多,如下:

CPoint();

CPoint(intinitX,intinitY);

CPoint(POINTinitPt);

2.CSize類

如果要表示距離以及相對(duì)位置,可以使用CSize對(duì)象。MFC類CSize實(shí)際是SIZE結(jié)構(gòu)派生而來的,SIZE結(jié)構(gòu)的定義如下:

TypedefstructtagSIZE

{

LONGcx;

LONGcy;

}SIZE,*PSIZE;

CSize也繼承了SIZE結(jié)構(gòu)的數(shù)據(jù)成員

cx和cy,其構(gòu)造方法與CPoint類似。

3.CRect類

CRect類是繪圖時(shí)經(jīng)常遇到的類,它從RECT結(jié)構(gòu)派生,該結(jié)構(gòu)定義如下:

TypedefstructtagRECT

{

LONGleft;

LONGtop;

LONGright;

LONGbottom;

}RECT;

CRect類繼承了RECT結(jié)構(gòu)的數(shù)據(jù)成員left、top、right和bottom。相比于CPoint類和CSize類,CRect的成員函數(shù)更多。表8-4給出部分在CRect類中定義的成員函數(shù)。

4.設(shè)置背景顏色

在默認(rèn)情況下,繪制圖形或顯示文本時(shí)的背景顏色為白色,但用戶可以使用CDC的成員函數(shù)SetBkColor()來設(shè)置新的背景顏色。其函數(shù)原型為:

VirtualCOLORREF

SetBkColor(COLORREFcrColor);

這里,crColor為指定的新的背景色。

5.設(shè)置背景模式

使用SetBkColor()函數(shù)設(shè)置背景顏色之后,只有在使用CDC成員函數(shù)SetBkMode()設(shè)置背景模式后,設(shè)置的背景顏色才會(huì)在輸出時(shí)有效。SetBkColor()函數(shù)原型如下:

intSetBkMode(intnBkMode);

nBkMode參數(shù)如表8-5所示。

8.2繪圖實(shí)例

下面通過三個(gè)實(shí)例來學(xué)習(xí)如何利用CDC類函數(shù)、畫筆、畫刷以及字體。

8.2.1CDC類函數(shù)的應(yīng)用

【例8-1】

在SDI下,在客戶區(qū)輸出坐標(biāo)系下的余弦曲線。

在這個(gè)例子中,應(yīng)用CDC提供的繪圖函數(shù)來繪制一個(gè)余弦曲線,操作步驟如下:

(1)在VisualC++6.0操作界面下,選擇菜單欄“文件/新建”選項(xiàng)。

(2)在彈出的新建菜單對(duì)話框中,選擇“工程/”文件夾下

,在靜態(tài)文本“工程”下的編輯框中輸入“chap8_1”。

(3)在“MFCAppWizard–Step1”對(duì)話框中,選中“單個(gè)文檔”單選框,按“完成”按鈕結(jié)束。

(4)在項(xiàng)目區(qū)中,選擇,選中并展開,選中并展開文件夾,雙擊。

(5)在右邊工作區(qū)中,修改文件起始部分內(nèi)容:

#include"stdafx.h"

#include"chap8.h"

#include"math.h"

#include"chap8Doc.h"

#include"chap8View.h"

注意,由于在后面的編程中,要使用到sin函數(shù),因此必須添加頭文件“math.h”。

(6)回到,在下選中并展開,選中其下雙擊,在右邊工作區(qū)中,光標(biāo)移動(dòng)到該函數(shù)體起始位置。

(7)修改函數(shù)體中的內(nèi)容:

voidCChap8View::OnDraw(CDC*pDC)

{

CChap8Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:adddrawcodefornativedatahere

pDC->MoveTo(150,350);//畫坐標(biāo)系

pDC->LineTo(550,350); pDC->MoveTo(150,350);

pDC->LineTo(150,50);

pDC->TextOut(150,10,"cos");

pDC->TextOut(550,350,"x");

doubley,y1;

POINTp;

for(inti=0;i<400;i++)//求余弦值并畫點(diǎn)

{

y1=double(i)/400*2*3.1415;

y=150*cos(y1);//求余弦值

p.x=i+150;

p.y=int(200-y);

pDC->SetPixel(p,RGB(0,0,0,));

}

}

(8)按下“Ctrl+F5”鍵,運(yùn)行程序,結(jié)果如圖8-3所示。圖8-3例8-1輸出8.2.2畫筆、畫刷應(yīng)用實(shí)例

【例8-2】

建立一個(gè)應(yīng)用程序,輸出一個(gè)矩形,通過工具欄可以修改矩形的顏色、外框線型寬度和內(nèi)部填充色。

在這個(gè)例子中,將應(yīng)用畫筆和畫刷練習(xí)如何更改圖形的顏色,內(nèi)部填充等操作功能,操作步驟如下:

(1)在VisualC++6.0操作界面下,選擇菜單欄“文件”選項(xiàng),在下拉菜單中,選中“新建”選項(xiàng)。

(2)在彈出的新建菜單對(duì)話框中,選擇“工程”文件夾下

,在靜態(tài)文本“工程”下的編輯框中輸入“chap8_2”。

(3)在“MFCAppWizard–Step1”對(duì)話框中,選中“單個(gè)文檔”單選框,按“完成”按鈕結(jié)束。

(4)在項(xiàng)目區(qū)中,選擇,將文件夾展開,選中,將其展開,用鼠標(biāo)雙擊。

(5)在右邊的工作區(qū)中的工具欄編輯區(qū)中,利用提供的調(diào)色板和繪圖工具欄,手動(dòng)添加幾個(gè)工具欄按鈕。

(紅色):為畫筆或畫刷提供關(guān)于顏色的信息,按下該按鈕,顏色設(shè)置為紅色,其ID值為ID_RED。

(藍(lán)色):為畫筆或畫刷提供關(guān)于顏色的信息,按下該按鈕,顏色設(shè)置為藍(lán)色,其ID值為ID_BLUE。

(綠色):為畫筆或畫刷提供關(guān)于顏色的信息,按下該按鈕,顏色設(shè)置為綠色,其ID值為ID_GREEN。

(黑色):為畫筆或畫刷提供關(guān)于顏色的信息,按下該按鈕,顏色設(shè)置為黑色,其ID值為ID_BLACK。

(灰色):為畫筆或畫刷提供關(guān)于顏色的信息,按下該按鈕,顏色設(shè)置為灰色,其ID值為ID_GRAY。

(線寬增加):提供畫筆的寬度信息,按下該按鈕,線寬增加1,其ID值為ID_ADD。

(線寬減少):提供畫筆的寬度信息,按下該按鈕,線寬減少1,其ID值為ID_DEC。

(畫刷):提供畫刷信息,按下該按鈕,表示進(jìn)行畫刷的選擇,對(duì)圖形內(nèi)部進(jìn)行顏色填充,其ID值為ID_BRUSH。

(6)按下“Ctrl+W”鍵,彈出“MFCClassWizard”對(duì)話框,如圖8-4所示。在“Classname”中,選擇“CChap8_2Doc”。在“ObjectIDs”中找到“ID_RED”雙擊,在“Messages”中選中“COMMAND”并雙擊,在“Memberfunctions”中出現(xiàn)

成員函數(shù)。圖8-4“MFCClassWizard”對(duì)話框

(7)同樣的方法,為ID_BLUE、ID_GREEN、ID_BLACK、ID_GRAY、ID_ADD、ID_DEC、ID_BRUSH進(jìn)行相同的操作,增加“COMMAND”消息處理函數(shù),選擇“確定”按鈕。

(8)回到項(xiàng)目區(qū)中,選擇“ClassView”,選中“CChap8_2Doc”,鼠標(biāo)右鍵單擊,在彈出菜單中選擇“AddMemberVariable”對(duì)話框,如圖8-5所增。在彈出對(duì)話框中,“VariableTyep”下編輯框中輸入“int”,“VariableName”下編輯框中輸入“yanse”,“Access”設(shè)為默認(rèn)值“Protected”類型。圖8-5添加成員變量對(duì)話框這樣就在“CChap8_2Doc”類中增加了一個(gè)名為“yanse”的整型公有型變量。

(9)使用同樣的方法,在“CChap8_2Doc”類中分別增加名為“l(fā)ine”和“brush”的整型共有型變量。

這里,“yanse”用來作為顏色選擇的標(biāo)識(shí),1為紅色,2為藍(lán)色,3為綠色,4為黑色,5為灰色;“l(fā)ine”用來作為線寬選擇的標(biāo)識(shí),1為線寬增加1,2為線寬減小1;“brush”用來作為畫刷選擇的標(biāo)識(shí),1為選中畫刷,對(duì)矩形內(nèi)部進(jìn)行填充。

(10)展開圖標(biāo),在其構(gòu)造函數(shù)中

,修改其中內(nèi)容,為變量賦初值:

CChap8_2Doc::CChap8_2Doc()

{

//TODO:addone-timeconstructioncodehere

brush=0;

line=0;

yanse=0;

}(11)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnAdd()

{

//TODO:Addyourcommandhandlercodehere

line=1;

UpdateAllViews(NULL);

}

(12)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnBlack()

{

//TODO:Addyourcommandhandlercodehere

yanse=4;

UpdateAllViews(NULL);

}(13)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnBlue()

{

//TODO:Addyourcommandhandlercodehere

yanse=2;

UpdateAllViews(NULL);

}

(14)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnBrush()

{

//TODO:Addyourcommandhandlercodehere

brush=1;

UpdateAllViews(NULL);

}(15)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnDec()

{

//TODO:Addyourcommandhandlercodehere

line=2;

UpdateAllViews(NULL);

}

(16)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnGray()

{

//TODO:Addyourcommandhandlercodehere

yanse=5;

UpdateAllViews(NULL);

}(17)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnGreen()

{

//TODO:Addyourcommandhandlercodehere

yanse=3;

UpdateAllViews(NULL);

}

(18)選中雙擊,在右邊的工作區(qū)中修改其內(nèi)容:

voidCChap8_2Doc::OnRed()

{

//TODO:Addyourcommandhandlercodehere

yanse=1;

UpdateAllViews(NULL);

}

(19)回到中,選中,用鼠標(biāo)右鍵單擊,在彈出菜單中,選擇“AddMemberVariable”,在彈出對(duì)話框中添加如表8-6所示的成員變量。

(20)回到,選中函數(shù)雙擊,在右邊工作區(qū)中,光標(biāo)移動(dòng)到該函數(shù)體起始位置。修改函數(shù)體中的內(nèi)容:

voidCChap8_2View::OnDraw(CDC*pDC)

{

CChap8_2Doc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:adddrawcodefornativedatahere

CPennewpen;//新畫筆

CBrushnewbrush;//新畫刷

switch(pDoc->yanse)//根據(jù)“yanse”參數(shù)確定當(dāng)前顏色

{case1://紅色

color=RGB(255,0,0);

break;

case2://藍(lán)色

color=RGB(0,0,255);

break;

case3://綠色

color=RGB(0,255,0);

break;

case4://黑色

color=RGB(0,0,0);

break;

case5://灰色

color=RGB(127,127,127);

break;

}switch(pDoc->line)

//根據(jù)“l(fā)ine”信息,選擇畫筆線寬操作

{

case1://增加畫筆線寬

{

width++;

break;

}

case2://減少畫筆線寬

{

width--;

break;

}

}

newpen.CreatePen(0,width,color);//以選擇后的線寬和顏色創(chuàng)建新畫筆

newbrush.CreateSolidBrush(color);//以選擇后的顏色創(chuàng)建新畫刷

if(pDoc->brush==1)//如果選擇了畫刷按鈕

pDC->SelectObject(&newbrush); //使用畫刷進(jìn)行填充

else

pDC->SelectObject(&newpen);

//使用畫筆畫線

pDC->Rectangle(100,100,200,200);

//畫矩形

}

(21)按下“Ctrl+F5”鍵,運(yùn)行程序。初始畫面選擇圖形輸出結(jié)果如圖8-6所示。圖8-6選擇圖形輸出結(jié)果

(22)選擇,連續(xù)按下,則輸出如圖8-7所示。

(23)選擇,再按下,輸出如圖8-8所示。圖8-7選擇線寬輸出結(jié)果圖8-8選擇畫刷輸出結(jié)果8.2.3文本輸出應(yīng)用實(shí)例

【例8-3】

在SDI下輸出用戶指定大小的文字,使其具有霓虹燈效果,每隔1秒變換一種顏色。

SetTimer()函數(shù)介紹:

本例中要求輸出文本有霓虹燈效果,每隔一定時(shí)間顏色改變,這就要使用SetTimer函數(shù)。當(dāng)需要每隔一段時(shí)間執(zhí)行一件事的時(shí)候就需要使用SetTimer函數(shù)。使用定時(shí)器的方法比較簡(jiǎn)單,通常告訴Windows一個(gè)時(shí)間間隔,然后Windows以此時(shí)間間隔周期性觸發(fā)程序。通常用兩種方法來實(shí)現(xiàn):發(fā)送WM_TIMER消息和調(diào)用應(yīng)用程序定義的回調(diào)函數(shù)。

WM_TIMER消息需要有個(gè)觸發(fā)事件,其觸發(fā)函數(shù)為SetTimer,原型為:

UINTSetTimer(UINTnIDEvent,UINTnElapse,void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,YINT,DWORD))

當(dāng)使用SetTimer函數(shù)的時(shí)候,就會(huì)生成一個(gè)計(jì)時(shí)器。參數(shù)nIDEvent指的是計(jì)時(shí)器的標(biāo)識(shí),也就是名字;參數(shù)nElapse指的是時(shí)間間隔,也就是每隔多長(zhǎng)時(shí)間觸發(fā)一次事件,單位為毫秒;第三個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),在這個(gè)函數(shù)里,放入想要做的事情的代碼,也可以將它設(shè)定為NULL,也就是使用系統(tǒng)默認(rèn)的回調(diào)函數(shù),系統(tǒng)默認(rèn)的是onTime函數(shù)。在本例中,練習(xí)使用字體類對(duì)文本的顏色進(jìn)行修改,操作步驟如下:

(1)在VisualC++6.0操作界面下,選擇菜單欄“文件”選項(xiàng),在下拉菜單中,選中“新建”選項(xiàng)。

(2)在彈出的新建菜單對(duì)話框中,選擇“工程”文件夾下

,在靜態(tài)文本“工程”下的編輯框中輸入“chap8_3”。

(3)在“MFCAppWizard–Step1”對(duì)話框中,選中“單個(gè)文檔”單選框,按“完成”按鈕結(jié)束。

(4)選中,用鼠標(biāo)右鍵單擊,在彈出菜單中選擇“AddMemberVariable”,按照表8-7所示添加成員變量。

(5)選中并雙擊,光標(biāo)移動(dòng)到函數(shù)體起始位置。該函數(shù)為“CChap8_3View”的構(gòu)造函數(shù),在里面可以進(jìn)行變量的初始化,用戶對(duì)函數(shù)進(jìn)行修改:

CChap8_3View::CChap8_3View()

{

//

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論