Visual C++面向?qū)ο笈c可視化程序設(shè)計(jì)(第5版)課件 第3、4章 -文本與字體、鍵盤與鼠標(biāo)_第1頁
Visual C++面向?qū)ο笈c可視化程序設(shè)計(jì)(第5版)課件 第3、4章 -文本與字體、鍵盤與鼠標(biāo)_第2頁
Visual C++面向?qū)ο笈c可視化程序設(shè)計(jì)(第5版)課件 第3、4章 -文本與字體、鍵盤與鼠標(biāo)_第3頁
Visual C++面向?qū)ο笈c可視化程序設(shè)計(jì)(第5版)課件 第3、4章 -文本與字體、鍵盤與鼠標(biāo)_第4頁
Visual C++面向?qū)ο笈c可視化程序設(shè)計(jì)(第5版)課件 第3、4章 -文本與字體、鍵盤與鼠標(biāo)_第5頁
已閱讀5頁,還剩106頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1第3章文本與字體

使用定義好的與設(shè)備無關(guān)的字體集,

Windows就能維護(hù)它的設(shè)備無關(guān)性,提供“所見即所得”的好處,即屏幕所見與設(shè)備輸出的文本是一樣的

基于Windows開發(fā)經(jīng)常使用GDI進(jìn)行文本輸出。在一定意義上,任何內(nèi)容都可以看成圖形實(shí)體圖形和文本并沒有明顯的界限文本操作先要獲得文本句柄設(shè)置字體、字符大小、字符顏色等有關(guān)屬性將這些屬性選入設(shè)備環(huán)境(如果是系統(tǒng)的字體,就不用選入操作,會(huì)自動(dòng)進(jìn)行)23.1設(shè)置文本的設(shè)備環(huán)境字體邏輯字體定義的字符集是設(shè)備無關(guān)的,它可以精確標(biāo)度,因此得到廣泛應(yīng)用描述所要顯示的文本的大小、類型和外形物理字體是為特殊設(shè)備設(shè)計(jì)的,因而是設(shè)備相關(guān)的Win系統(tǒng)提供了七種基本字體字體 說明 ANSI_FIXED_FONT ANSI標(biāo)準(zhǔn)的固定寬度的字體ANSI_VAR_FONT ANSI標(biāo)準(zhǔn)的可變寬度的字體

DEFAULT_GUI _FONT 當(dāng)前GUI的缺省字體

OEM_FIXED_FONT 由標(biāo)準(zhǔn)原設(shè)備制造商(OEM)提供 DEVICE_DEFAULT_FONT 當(dāng)前圖形設(shè)備的字體 SYSTEM_FIXED_FONT Windows的標(biāo)準(zhǔn)固定寬度的字體SYSTEM_FONT Windows提供的可變寬度的字體

常作為缺省字體

Win用它作為系統(tǒng)界面字體33.1.1字體句柄Windows系統(tǒng)提供了7種基本字體字體說明ANSI_FIXED_FONTANSI標(biāo)準(zhǔn)的固定寬度的字體DEFAULT_GUI_FONT當(dāng)前GUI的默認(rèn)字體OEM_FIXED_FONT標(biāo)準(zhǔn)原設(shè)備制造商(OEM)提供的字體SYSTEM_FONTWindows提供的可變寬度的字體,它常做為默認(rèn)字體ANSI_VAR_FONTANSI標(biāo)準(zhǔn)的可變寬度的字體DEVICE_DEFAULT_FONT當(dāng)前圖形設(shè)備的字體SYSTEM_FIXED_FONTWindows的標(biāo)準(zhǔn)固定寬度的字體4(1)定義字體句柄變量:

HFONThF;//hF為字體的句柄(2)調(diào)函數(shù)GetStockObject獲得系統(tǒng)字體句柄它返回的是系統(tǒng)的缺省字體

hF=GetStockObject():(3)調(diào)用函數(shù)SelectObject將字體選入設(shè)備環(huán)境

hDC->SelectObject(hF);選擇系統(tǒng)字體的步驟5由于系統(tǒng)提供的字體往往不能滿足需要,若需要定義系統(tǒng)以外的字體,可以調(diào)用函數(shù)GreateFont自行創(chuàng)建HFont=CreateFont(intnHeight, //字體高度,0采用系統(tǒng)缺省值,使用邏輯單位

intnWidth, //字體寬度,取0則由系統(tǒng)根據(jù)高寬比取最佳值

intnEscapement, //每行文字相對于頁底的角度,單位為0.1度

intnOrienation, //每個(gè)文字相對于頁底的角度,單位為0.1度

DWORDnWeight, //字體粗細(xì)度,范圍為0~1000DWORDDwltalic, //如果要求字體傾斜,則取非零

DWORDdwUnderline, //如果要求下劃線,則取非零

DWORDdwStrikeout, //如果要求中劃線,則取非零

DWORDdwCharset, //字體所屬字符集

DWORDdwOutputPrecision,//輸出精度,一般取缺省值OUT_DEFAULT_PRECISDWORDdwClipPrecision,//剪裁精度,常取缺省值CLIP_DEFAULT_PRECISDWORDdwQuality, //輸出質(zhì)量,一般取缺省值DEFAULT_QUALITYDWORDdwPitchAndFamily,//字體名)部分可選的系統(tǒng)字符集:ANSI_CHARSETOEM_CHARSETGB2312_CHARSETCHINESEBIG5_CHARSETDEFAULT_CHARSETSHIFTJIS_CHARSET63.1.2設(shè)置字體和背景顏色設(shè)置字體顏色:hDC->SetTextColor(crColor);設(shè)置背景顏色:hDC->SetBkColor(crColor);crColor為設(shè)置的顏色字體及背景顏色的設(shè)置在開發(fā)過程中非常重要73.2文本的輸出過程確定后續(xù)文本坐標(biāo)確定換行時(shí)文本坐標(biāo)文本輸出過程獲取字體信息格式化文本輸出文本8(1)獲取字體信息輸出文本之前要獲取字體的信息,如字符高度等,以確定輸出格式和下一行字符的位置

GetTextMetrics(hdc,&tm);//tm為TEXTMETRIC結(jié)構(gòu)獲取當(dāng)前使用字體信息調(diào)用該函數(shù)時(shí),系統(tǒng)將當(dāng)前字體的信息拷貝到tm標(biāo)識(shí)的TEXTMETRIC結(jié)構(gòu)中9系統(tǒng)定義的TEXTMETRICS的結(jié)構(gòu)如下:typedefstructtagTEXTMETRIC{ //tmLONGtmHeight; //字符高度LONGtmAscent; //字符基線以上高度LONGtmDescent; //字符基線以下高度LONGtmInternalLeading; //tmHeight制訂的字符高度頂部的控件LONGtmExternalLeading; //行與行之間的間隔LONGtmAveCharWidth; //平均字符寬度LONGtmMaxCharWidth; //最大字符寬度LONGtmWeight; //字符的粗細(xì)度LONGtmOverhang; //合成字體間附加的寬度LONGtmDigitizedAspectX; //為輸出設(shè)備設(shè)計(jì)的X軸尺寸LONGtmDigitizedAspectY; //為輸出設(shè)備設(shè)計(jì)的Y軸尺寸BCHARtmFirstChar; //字體中第一個(gè)字符值BCHARtmLastChar; //字體中最后一個(gè)字符值BCHARtmDefaultChar; //代替不在字體中字符的字符BCHARtmBreakChar; //作為分割符的字符BYTEtmItalic; //非0則表示字體為斜體BYTEtmUnderlined; //非0則表示字體有下劃線BYTEtmStruckOut; //非0則表示字符為刪除字體BYTEtmPitchAndFamily; //字體間距和字體族BYTEtmCharSet; //字符集}TEXTMETRICReturn10(2)格式化文本(a)確定后續(xù)文本坐標(biāo)換行時(shí)確定下一行文本的坐標(biāo)需要格式化處理的情況在文本行中確定后續(xù)文本的坐標(biāo)確定后續(xù)文本的坐標(biāo),應(yīng)先獲取當(dāng)前的字符串的寬度,

該工作由GetTextExtentPoint32函數(shù)完成,并把它存儲(chǔ)于一個(gè)SIZE結(jié)構(gòu)中。BOOLGetTextExtentPoint32(

HDChdc,

LPCTSTRlpszString,//指定的字符串

intnLength, //字符串中的字符數(shù)

LPSIZElpSize

//返回字符串寬度及高度的SIZE數(shù)據(jù)結(jié)構(gòu)的地址)SIZE數(shù)據(jù)結(jié)構(gòu)的定義typedefstructtagSIZE{LONGcx;

LONGcy;

}SIZE;例如,X軸起始坐標(biāo)為cx0,后續(xù)文本起始坐標(biāo)cx1為:

cx1=cx0+size.cx;Return11(b)確定換行時(shí)文本坐標(biāo)字符的高度與行間隔均存儲(chǔ)在tm指向的TEXTMETRIC結(jié)構(gòu)中,若當(dāng)前行的坐標(biāo)為y0,則換行時(shí)Y軸上文本的坐標(biāo)y0,為換行時(shí)Y軸上文本的起始坐標(biāo)y為:

y=y0+tm.tmHeight+tm.tmExternalLeading;或:y=y0+size.cy;//size的信息由函數(shù)GetTextExtentPoint32獲取Return

通過計(jì)算當(dāng)前行文本字符的高度與行間隔之和,即可得到換行時(shí)文本的起始坐標(biāo)12(3)文本輸出

常用的文本輸出函數(shù)TextOut原型如下:BOOLTextOut(

HDChdc,

intX,intY, //X,Y為用戶區(qū)中字符串的起始坐標(biāo)

LPCTSTRlpstring,//lpstring為顯示的字符串

intnCount //nCount為字符串中的字節(jié)數(shù)

);TextOut

以坐標(biāo)X,Y為起點(diǎn),輸出字節(jié)數(shù)為nCount、名為lpstring中的字符串13也可用DrawText函數(shù)將文本輸出到一個(gè)矩形中,DrawText原型如下:intDrawText(HDChDC, //DC句柄LPCTSTRlpString, //輸出的文本內(nèi)容intnCount, //文本長度LPRECTlpRect, //輸出尺寸UINTuFormat //輸出選項(xiàng));指定格式化文本的方法??梢允窍铝兄档娜我饨M合,部分選項(xiàng)如下DT_BOTTOM:將正文調(diào)整到矩形底部。此值必須和DT_SINGLELINE組合DT_CALCRECT:決定矩形的寬和高DT_CENTER:使正文在矩形中水平居中DT_LEFT:正文左對齊DT_RIGHT:正文右對齊DT_TOP:正文頂端對齊(僅對單行)DT_VCENTER:正文水平居中(僅對單行)143.3文本操作實(shí)例【例3-1】在用戶窗口上輸出幾行字符串,當(dāng)窗口接收到刷新消息后,顯示的文本每次都被重新刷新。具體代碼如下:1:在類中添加變量: CDC*hDC; TEXTMETRICtm;152:在cpp文件中添加如下變量:

longnXChar,nYChar; //這兩個(gè)變量用來存儲(chǔ)字符寬度和高度Tip:字體的信息通常賦值給全局變量3:在初始化函數(shù)OnInitDialog中添加如下代碼:

hDC=GetDC(); //獲取當(dāng)前設(shè)備表句柄 hDC->GetTextMetrics(&tm); //獲取字體信息 nXChar=tm.tmAveCharWidth; //獲取字符寬度 nYChar=tm.tmHeight+tm.tmExternalLeading; ReleaseDC(hDC); //釋放當(dāng)前設(shè)備句柄16刷新函數(shù)的代碼:CPaintDCdc(this); //用于繪制的設(shè)備上下文shortx;intLnCount=6; //輸出的內(nèi)容共有6行TCHARtextbuf[6][50]= {L"Thisisthefirstline", L"Thisisthesecondline", L"Thisisthethirdline", L"Thisisthefourthline", L"Thisisthefifthline", L"Thisisthesixthline"};hDC=GetDC(); //獲取DC,準(zhǔn)備輸出文字for(x=0;x<LnCount;x=x+1)hDC->TextOut(nXChar,nYChar*(1+x),textbuf[x],lstrlen(textbuf[x]));ReleaseDC(hDC);輸出的文本內(nèi)容17【3-2】在窗口中顯示出26個(gè)英文字母,從左向右字母依次位置提高10個(gè)像素單位,并且顏色變?yōu)榧t色,然后回到正常位置;當(dāng)?shù)竭_(dá)最右端后改變方向從右向左依次變成紅色并位置提高10個(gè)像素單位。在窗口的第二行顯示26個(gè)字母,字體從正常到斜體,顏色從黑色到天藍(lán)色不斷變換。如圖所示。用bRight,bLeft標(biāo)志當(dāng)前移動(dòng)方向,初始化bRight=TRUE,bLeft=FALSE用nChar標(biāo)志紅色跳起字母在26個(gè)字母的位置18根據(jù)題目的要求,我們要做到如下幾點(diǎn):定義一個(gè)全局變量nChar來標(biāo)志紅色跳起字母在26個(gè)字母的位置,因?yàn)榧t色的字母移動(dòng)方向是左右循環(huán)的,所以定義全局變量bRight和bLeft,以標(biāo)志當(dāng)前移動(dòng)方向是向右還是向左,初始化bRight=TRUE,bLeft=FALSE,表明方向是從左向右;由消息WM_TIMER的消息處理函數(shù)OnTimer函數(shù)發(fā)出刷新請求,在初始化函數(shù)中添加如下代碼: SetTimer(1,100,NULL); //建立計(jì)時(shí)器,每0.1秒發(fā)出WM_TIMER消息.說明是每0.1秒發(fā)出WM_TIMER消息,然后定時(shí)器消息處理過程調(diào)用Invalidate()發(fā)出刷新用戶區(qū)的請求,發(fā)送WM_PAINT消息,實(shí)現(xiàn)用戶區(qū)的動(dòng)態(tài)顯示。由OnPaint()函數(shù)完成刷新操作。19本例題要解決動(dòng)態(tài)顯示問題:

然后處理第一行字符:在OnPaint消息處理程序中,在得到了設(shè)備環(huán)境句柄hDC后,調(diào)用用戶自定義的函數(shù)HFONTCreateFont(intnCharHeight,BOOLbItalic);,第一個(gè)參數(shù)nCharHeight是字體高度,這里自定義為40,第2個(gè)參數(shù)bItalic是斜字體的標(biāo)志變量,取0表示不傾斜,取1表示傾斜。OnInitDialog消息處理程序定時(shí)器調(diào)用SetTimer(…)創(chuàng)建WM_TIMER消息處理程序調(diào)用Invalidate()刷新用戶區(qū)調(diào)用OnPaint函數(shù)實(shí)現(xiàn)動(dòng)態(tài)顯示20在頭文件中添加如下變量: CDC*hDC; //定義設(shè)備環(huán)境句柄. HFONThF; //定義字體句柄. TEXTMETRICtm;//定義包含字體信息的變量.(2)在cpp文件的前部,定義了全局的函數(shù)及變量如下:HFONTCreateFont(intnCharHeight,BOOLbItalic);intnChar=0; //當(dāng)前字符位置BOOLbRight=TRUE,bLeft=FALSE,bItalic=FALSE;(3)在初始化函數(shù)中創(chuàng)建定時(shí)器: SetTimer(1,100,NULL); //建立計(jì)時(shí)器,每0.1秒發(fā)出WM_TIMER消息.21(4)創(chuàng)建對定時(shí)器的消息響應(yīng)函數(shù)如下(在對話框類-單擊鼠標(biāo)右鍵-“類向?qū)А?“消息”-找到WM_TIMER消息-添加OnTimer消息處理函數(shù))voidCMy42Dlg::OnTimer(UINT_PTRnIDEvent){Invalidate();CDialogEx::OnTimer(nIDEvent);}

(5)完整的消息處理函數(shù)如下:CPaintDCdc(this); //用于繪制的設(shè)備上下文WCHARlpsz_1[]=L"abcdefghijklmnopqrstuvwxyz";//定義輸出的字符串intnCharlen=(int)wcslen(lpsz_1); //定義字符串長度變量//注意wcslen函數(shù)的返回值為寬字符串的長度,類型為size_t,是無符號(hào)的(易錯(cuò)),所以轉(zhuǎn)換成intintX=0,Y=0,i;hDC=GetDC(); //獲得設(shè)備環(huán)境指針22//輸出第1行字體.hF=CreateFont(40,0); //創(chuàng)建字體hDC->SelectObject(hF); //選入字體hDC->GetTextMetrics(&tm); //得到包含字體信息的結(jié)構(gòu)體Y=tm.tmExternalLeading+10; //設(shè)置輸出字符的Y坐標(biāo)for(i=0;i<nChar;i++){hDC->SetTextColor(RGB(0,0,0)); //設(shè)置字體的顏色為黑色X=X+tm.tmAveCharWidth*2; //設(shè)置輸出字符的X坐標(biāo)hDC->TextOut(X,Y,&lpsz_1[i],1);//輸出從第1個(gè)到第nChar個(gè)字符}//下面代碼操作是要輸出跳起來的那個(gè)字符hDC->SetTextColor(RGB(255,0,0)); //設(shè)置字體的顏色為紅色X=X+tm.tmAveCharWidth*2; //設(shè)置輸出字符的X,Y坐標(biāo)Y=tm.tmExternalLeading; //此字的位置高10個(gè)物理單位hDC->TextOut(X,Y,&lpsz_1[nChar],1); //輸出第nChar個(gè)字符//在輸出跳起來的那個(gè)字符的時(shí)候,要注意,在缺省模式的屏幕上,Y坐標(biāo)是向下的。因此,在輸出“沒有跳起來”的字符串的時(shí)候,是把這些字符串的輸出的Y坐標(biāo)加了10個(gè)單位,是下沉了10個(gè)單位,而“跳”起來的字符,Y坐標(biāo)并沒有做過調(diào)整,這樣看起來的效果是有一個(gè)字符“跳”起來。23Y=tm.tmExternalLeading+10; //恢復(fù)后續(xù)輸出字符的Y坐標(biāo)高度for(i=nChar+1;i<nCharlen;i++){hDC->SetTextColor(RGB(0,0,0)); //設(shè)置字體的顏色為黑色X=X+tm.tmAveCharWidth*2; //設(shè)置輸出字符的X坐標(biāo)hDC->TextOut(X,Y,&lpsz_1[i],1); //輸出后面的字符}//下面的條件判斷語句,要解決當(dāng)輸出到最后一個(gè)字符時(shí),要改變“跳”起來字符的//行進(jìn)方向,即從右到左,這個(gè)時(shí)候,把bRight設(shè)為FALSE,bLeft設(shè)為TRUE;if(nChar==nCharlen-1) //當(dāng)輸出到最后的一個(gè)字符時(shí),{ bRight=FALSE; //改變紅色字移動(dòng)的方向?yàn)橄蜃?bLeft=TRUE;}elseif(nChar==0) //當(dāng)從右到左行進(jìn)到第一個(gè)字符時(shí),改變行進(jìn)方向{ bRight=TRUE; //改變紅色字移動(dòng)的方向?yàn)橄蛴?bLeft=FALSE;}24//下面的if判斷是當(dāng)向右方向?yàn)檎鏁r(shí),沒顯示一次,nChar這個(gè)字符位置加1,否則減1if(bRight==TRUE) nChar++;elsenChar--;DeleteObject(hF); //刪除字體句柄//輸出第2行字體.hF=CreateFont(40,bItalic); //創(chuàng)建字體.大小為40hDC->SelectObject(hF); //選入字體X=tm.tmAveCharWidth*2; //設(shè)置輸出位置Y=tm.tmHeight*2;if(bItalic==TRUE)//如果斜體標(biāo)識(shí)為真,輸出斜體字,文字顏色為黑色hDC->SetTextColor(RGB(0,0,0));else //如果斜體標(biāo)識(shí)為假,輸出正體字,文字顏色為天藍(lán)色hDC->SetTextColor(RGB(0,255,255));hDC->TextOut(X,Y,lpsz_1,(int)wcslen(lpsz_1)); //輸出普通字符if(bItalic==TRUE)bItalic=FALSE; elsebItalic=TRUE; DeleteObject(hF); //刪除字體句柄 ReleaseDC(hDC); //刪除設(shè)備用戶指針25HFONTCreateFont(intnCharHeight,BOOLbItalic){HFONThFont; //定義字體句柄hFont=CreateFont( //定義字體句柄. nCharHeight, //字體高度. 0, //由系統(tǒng)根據(jù)高寬比選取字體最佳寬度值. 0, //文本傾斜度為0,表示水平. 0, //字體傾斜度為0. 400, //字體粗度.400為正常. bItalic, //是斜體字否? 0, //無下劃線. 0, //無刪除線. ANSI_CHARSET, //表示所用的字符集為ANSI_CHARSET. OUT_DEFAULT_PRECIS, //刪除精度為缺省值. CLIP_DEFAULT_PRECIS, //裁剪精度為缺省值. DEFAULT_QUALITY, //輸出質(zhì)量為缺省值. DEFAULT_PITCH|FF_DONTCARE, //字間距和字體系列使用缺省值. L"Arial"); //字體名稱. if(hFont==NULL) returnNULL; else returnhFont;}//上述的函數(shù)經(jīng)過如此定義后,如需多次調(diào)用,只要傳遞有限的兩個(gè)參數(shù),這樣可減少參數(shù)的輸入量,那些缺省值的就不用重復(fù)輸入,以降低出錯(cuò)的可能性。26【例3-3】本程序通過在窗口中分7行分別顯示7行文本,以說明在窗口的用戶區(qū)中格式及輸出文本的方法。其中,第1行的文字是紅色的;第2行是綠色的;第3行是藍(lán)色的;第4行使用斜體文字,并帶下劃線;第5行的文字恢復(fù)為紅色,但仍使用第4行字體的設(shè)置輸出,其中最后一行實(shí)際上是兩個(gè)字符串同行輸出。第7行使用DrawText輸出文本,并使顯示效果具有卡拉OK的效果,本程序的界面效果如下圖所示。271:添加類成員變量: CDC*hdc; HFONThF_black,hF_big; //定義兩種字體句柄 TEXTMETRICtm; //定義tm變量,用以記錄字體信息2:由于最后一行涉及文字的變化速度,因此需要設(shè)定定時(shí)器及定時(shí)器的消息響應(yīng),在初始化函數(shù)中定義一個(gè)定時(shí)器如下: SetTimer(9999,100,NULL);

然后在“類向?qū)А敝刑砑覹M_TIMER的消息響應(yīng),加粗斜體部分為加入的內(nèi)容,主要就是針對ID為9999的定時(shí)器發(fā)送Invalidate()刷新請求,這個(gè)刷新請求由OnPaint函數(shù)進(jìn)行響應(yīng)。代碼如下:voidCMy33Dlg::OnTimer(UINT_PTRnIDEvent){ switch(nIDEvent) {case9999: Invalidate(); } CDialogEx::OnTimer(nIDEvent);}28CPaintDCdc(this);//用于繪制的設(shè)備上下文LPCWSTRlpsz_1=L"這是一行紅色的、字體為SYSTEM_FONT的文字,紅色代表未來";LPCWSTRlpsz_2=L"現(xiàn)在顯示的是自定義綠色字體,綠色代表生機(jī)勃勃";LPCWSTRlpsz_3=L"這一行是藍(lán)色的粗體字,藍(lán)色代表廣闊的海洋和天空";LPCWSTRlpsz_4=L"這是大號(hào)、斜體并帶有下劃線的文字";LPCWSTRlpsz_5=L"您掌握了字體的操作了嗎?";LPCWSTRlpsz_6=L"祝您成功!";LPCWSTRlpsz_7=L"VisualC++課程很有用!";intX=0,Y=0; //第一行的輸出起始點(diǎn)位置坐標(biāo)staticRECTrect={0,300,0,350}; //定義一個(gè)矩形區(qū),用來對第7行文字進(jìn)行輸出SIZEsize; //定義一個(gè)SIZE類型的結(jié)構(gòu)rect.right+=2; //矩形的右邊界增2,實(shí)際上這是第7行的“卡拉OK”效果行進(jìn)速度hdc=GetDC();hdc->SetTextColor(RGB(255,0,0)); //設(shè)置文本顏色為紅色hdc->GetTextMetrics(&tm); //獲取默認(rèn)字體,寫入tm結(jié)構(gòu)中hdc->TextOut(X,Y,lpsz_1,(int)_tcsclen(lpsz_1)); //使用當(dāng)前字體輸出文本Y=Y+tm.tmHeight+tm.tmExternalLeading; //計(jì)算換行時(shí)下一行文本的輸出坐標(biāo)hF_black=CreateFont //創(chuàng)建自定義字體 (20, //字體的高度 0, //由系統(tǒng)根據(jù)高寬比選取字體最佳寬度值 0, //文本的傾斜度為,表示水平 0, //字體的傾斜度為0 29 FW_HEAVY, //字體的粗度,F(xiàn)W_HEAVY為最粗 0, //非斜體字 0, //無下劃線 0, //無刪除線 GB2312_CHARSET, //表示所用的字符集為ANSI_CHARSET OUT_DEFAULT_PRECIS, //輸出精度為默認(rèn)精度 CLIP_DEFAULT_PRECIS, //剪裁精度為默認(rèn)精度 DEFAULT_QUALITY, //輸出質(zhì)量為默認(rèn)值 DEFAULT_PITCH|FF_DONTCARE, //字間距和字體系列使用默認(rèn)值 L"粗體字" //字體名稱 ); hdc->SetTextColor(RGB(0,255,0)); //設(shè)置文本顏色為綠色 hdc->SelectObject(hF_black); //將自定義字體選入設(shè)備環(huán)境 hdc->GetTextMetrics(&tm); //獲取字體的信息,并寫入tm結(jié)構(gòu)中 hdc->TextOut(X,Y,lpsz_2,(int)_tcsclen(lpsz_2));//使用當(dāng)前字體輸出文本 Y=Y+tm.tmHeight+5*tm.tmExternalLeading;//計(jì)算新行的起始Y坐標(biāo)位置 GetTextExtentPoint32(*hdc,lpsz_2,(int)_tcsclen(lpsz_2),&size);//獲取字符串的寬度 hdc->SetTextColor(RGB(0,0,255)); //設(shè)置文本顏色為藍(lán)色 hdc->TextOut(X,Y,lpsz_3,(int)_tcsclen(lpsz_3)); //用當(dāng)前字體輸出文本 Y=Y+tm.tmHeight+5*tm.tmExternalLeading;30hF_big=CreateFont //引入新字體( 30, //字體高度 0,0,0,FW_NORMAL, 1, //定義斜體 1, //定義輸出時(shí)帶下劃線 0, GB2312_CHARSET, //所使用的字符集 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, L"大號(hào)字");hdc->SelectObject(hF_big); //將第二種自定義字體選入設(shè)備環(huán)境hdc->SetTextColor(RGB(155,155,155)); //設(shè)置文本顏色為灰色Y=Y+tm.tmHeight+5*tm.tmExternalLeading; //設(shè)置輸出文本的Y坐標(biāo)hdc->TextOut(X,Y,lpsz_4,(int)_tcsclen(lpsz_4)); //以當(dāng)前字體輸出文本hdc->SetTextColor(RGB(255,0,0)); //設(shè)置文本顏色為紅色Y=Y+tm.tmHeight+10*tm.tmExternalLeading; //設(shè)置輸出文本的Y坐標(biāo)hdc->TextOut(X,Y,lpsz_5,(int)_tcsclen(lpsz_5)); //輸出文本31//在該行繼續(xù)輸出文本GetTextExtentPoint32(*hdc,lpsz_5,(int)_tcsclen(lpsz_5),&size);X=X+size.cx; //獲取字符串的寬度hdc->TextOut(X+5,Y,lpsz_6,(int)_tcsclen(lpsz_6)); //輸出文本hdc->SetTextColor(RGB(0,0,0));hdc->SetBkColor(RGB(100,150,100)); //設(shè)置背景顏色hdc->TextOut(0,300,lpsz_7,(int)_tcsclen(lpsz_7)); //輸出文本hdc->SetTextColor(RGB(0,255,0)); //設(shè)置文本顏色hdc->SetBkColor(RGB(150,50,50)); //設(shè)置背景顏色hdc->DrawText(lpsz_7,(int)_tcslen(lpsz_7),&rect,DT_LEFT); //滾動(dòng)輸出文字GetTextExtentPoint32(*hdc,lpsz_7,(int)_tcsclen(lpsz_7),&size);if(rect.right>=size.cx)rect.right=0;//如果滾動(dòng)到最右邊,回零,從頭開始重新滾動(dòng)ReleaseDC(hdc);第7行的輸出,先設(shè)一矩形框,由“staticRECTrect={0,300,0,350}; ”來完成,設(shè)置字體顏色為黑色,由代碼“hdc->SetTextColor(RGB(0,0,0));”來完成,設(shè)置綠色背景由代碼“hdc->SetBkColor(RGB(100,150,100));”來完成,第7行的輸出由語句“hdc->TextOut(0,300,lpsz_7,(int)_tcsclen(lpsz_7));”來完成。再次設(shè)定背景顏色和文字顏色,通過DrawText函數(shù)進(jìn)行精準(zhǔn)覆蓋輸出,這樣就顯示了滾動(dòng)輸出的效果。如果滾動(dòng)到最右邊,則將矩形右邊界回零,此由判斷語句“if(rect.right>=size.cx)rect.right=0;”來完成。然后由于定時(shí)器還在繼續(xù)工作,文字滾動(dòng)將繼續(xù)下去。32

本例中還用到DrawText函數(shù),該函數(shù)在指定矩形中繪制帶格式的文本。它根據(jù)指定的方法格式化文本。函數(shù)原型如下:intDrawText

(LPCTSTRlpchText,//指向指定要繪制的文本的字符串的指針

intcchText, //字符串的長度(以字符為單位)

LPRECTlprc,//指向RECT結(jié)構(gòu)的指針,該結(jié)構(gòu)包含要設(shè)置文本格式的邏輯坐標(biāo)

UINTformat

);設(shè)置文本格式的方法。

此參數(shù)可使用以下一個(gè)或多個(gè)值,本例中用DT_LEFT,是將文本左對齊,即從左開始滾動(dòng)。33【例3-4】將一首四句的古詩從右到左豎排輸出。34步驟如下:1:在對話框中定義變量: CDC*hDC; //定義指向設(shè)備環(huán)境的句柄

TEXTMETRICtm; //存放字體各種屬性的結(jié)構(gòu)體變量2:字符的寬高度等信息均是在OnInitDialog中獲取,具體如下: hDC=GetDC(); //獲取當(dāng)前設(shè)備表句柄 hDC->GetTextMetrics(&tm); //獲取字體信息 nXChar=tm.tmAveCharWidth; //獲取字符寬度 nYChar=tm.tmHeight+tm.tmExternalLeading;//字符高度 nCaps=(tm.tmPitchAndFamily&1?3:2)*nXChar/2;//字間距 ReleaseDC(hDC);return0; //釋放當(dāng)前設(shè)備句柄

大家可以看到,在初始化函數(shù)中所增加的代碼,涉及到了一些變量,這些變量需要在cpp文件的開始位置定義為全局變量,具體如下:longnXChar,nCaps,nYChar;

353:編寫刷新函數(shù),具體代碼如下:intpointx,pointy,i,j; //pointx,pointy為文字輸出位置的坐標(biāo)LPCWSTRtextbuf[4]={ L"故人西辭黃鶴樓",L"煙花三月下?lián)P州", L"孤帆遠(yuǎn)影碧空盡",L"唯見長江天際流"};CPaintDCdc(this); //用于繪制的設(shè)備上下文hDC=GetDC(); //開始繪圖for(i=4;i>0;i--){ for(j=0;j<7;j++) //循環(huán)控制文本輸出 {pointx=300+i*nXChar*5; //x坐標(biāo)計(jì)算 pointy=150+j*(nYChar+nCaps); //y坐標(biāo)計(jì)算 hDC->TextOut(pointx,pointy,textbuf[4-i]+j,1);//輸出文字}}ReleaseDC(hDC); //結(jié)束繪圖36【例3-5】在用戶窗口上輸出一個(gè)扇形,并在扇面豎向輸出一首唐詩,詩詞的內(nèi)容為“《黃鶴樓》唐

崔顥,昔人已乘黃鶴去,此地空余黃鶴樓。黃鶴一去不復(fù)返,白云千載空悠悠。晴川歷歷漢陽樹,芳草萋萋鸚鵡洲。日暮鄉(xiāng)關(guān)何處是,煙波江上使人愁?!北纠€要求當(dāng)窗口放大或縮小后,扇形圖案也隨之縮放。371:本例輸出的文字布局帶有藝術(shù)效果,而且文字的大小和顏色均是漸進(jìn)變化的,同時(shí),文字輸出的布局也不是傳統(tǒng)意義上的橫平豎直排列,因此,這個(gè)例子主要的工作在于文字輸出位置的坐標(biāo)計(jì)算,至于文字大小和顏色漸變,相對好處理,只要設(shè)置線性變化的規(guī)則就可。在這個(gè)思路的基礎(chǔ)上,我們首先要繪制一個(gè)扇形,然后將扇形按角度劃分九等分,這些都可以通過簡單的幾何計(jì)算得到結(jié)果。2:添加類成員變量: CDC*hDC; HFONTfont; HPENhPen;3:程序用到圓周率,添加宏定義:#definePI3.14159264:由于程序用到自定義字體,系統(tǒng)提供了自定義字體的函數(shù)CreateFont,但參數(shù)太多,這里定義來CreateMyFont函數(shù),在其內(nèi)部調(diào)用CreateFong函數(shù),這樣在多次調(diào)用的時(shí)候,就不用每次輸入太多參數(shù),減少出差錯(cuò)的機(jī)會(huì),也使得代碼簡單。HFONTCreateMyFont(LPCTSTRfontName,intheight,intlean); //創(chuàng)建自定義字體,三個(gè)參數(shù)分別是字體名稱、height是字體高度,lean是文字傾斜度HFONTCreateMyFont(LPCTSTRfontName,intheight,intlean){returnCreateFont //創(chuàng)建自定義字體 (height, //字體的高度 0, //由系統(tǒng)根據(jù)高寬比選取字體最佳寬度值 lean, ////傾斜度為lean,其值由調(diào)用時(shí)傳過來 0, //字體的傾斜度為0 FW_HEAVY, //字體的粗度,F(xiàn)W_HEAVY為最粗38 0, //非斜體字 0, //無下劃線 0, //無刪除線 GB2312_CHARSET, //表示所用的字符集為ANSI_CHARSET OUT_DEFAULT_PRECIS, //輸出精度為默認(rèn)精度 CLIP_DEFAULT_PRECIS, //剪裁精度為默認(rèn)精度 DEFAULT_QUALITY, //輸出質(zhì)量為默認(rèn)值 DEFAULT_PITCH|FF_DONTCARE,//字間距和字體系列使用默認(rèn)值 fontName //字體名稱 );}5:刷新函數(shù)代碼如下:voidCMy35Dlg::OnPaint(){LPCWSTRtitle=L"黃鶴樓唐.崔顥";LPCWSTRpoem[8]={L"昔人已乘黃鶴去",L"此地空余黃鶴樓",

L"黃鶴一去不復(fù)返",L"白云千載空悠悠",

L"晴川歷歷漢陽樹",L"芳草萋萋鸚鵡洲",

L"日暮鄉(xiāng)關(guān)何處是",L"煙波江上使人愁"

};intr,r0,i,j=-1,fontSize,fontSize0,color;//扇形外弧半徑r和內(nèi)弧半徑r0,fontSize,fontSize0分別是字體大小39RECTclientDimension; //存放客戶區(qū)的尺寸POINTbegin,end,org; //保存點(diǎn)的信息,org表示圓心坐標(biāo)//“begin,end,org”參數(shù)分別存儲(chǔ)畫線時(shí)候的起點(diǎn)和終點(diǎn)坐標(biāo),

org是扇形圓心點(diǎn)的坐標(biāo)。doublesita; //表示文字傾斜及畫圖時(shí)的角度CPaintDCdc(this); //用于繪制的設(shè)備上下文hDC=GetDC();hPen=CreatePen(PS_DASH,1,RGB(127,127,127));hDC->SelectObject(hPen);GetClientRect(&clientDimension);//獲取客戶區(qū)的尺寸if((clientDimension.right-clientDimension.left)<400||(clientDimension.bottom-clientDimension.top)<300)//判斷屏幕尺寸{MessageBox(L"屏幕尺寸太小,無法繪圖!",L"錯(cuò)誤信息",0);return;}40r=(clientDimension.bottom-clientDimension.top)*8/10;//用屏幕高度的/5作為扇形的半徑org.x=(clientDimension.right-clientDimension.left)/2;org.y=(clientDimension.bottom-clientDimension.top)*9/10;//將圓心坐標(biāo)定在屏幕中間向下的/10處hDC->Arc(org.x-r,org.y-r,org.x+r,org.y+r,org.x+(int)(r*sin(PI/3)),org.y-(int)(r*cos(PI/3)),org.x-(int)(r*sin(2*PI/3)),org.y+(int)(r*cos(2*PI/3)));//畫外圍圓弧//以下是從圓心點(diǎn)出發(fā)的10條虛線,for(sita=PI/6;sita<=PI*5/6;sita+=PI*2/27){begin.x=org.x-(int)(r*cos(sita));begin.y=org.y-(int)(r*sin(sita));hDC->MoveTo(begin.x,begin.y);end.x=org.x;end.y=org.y;hDC->LineTo(end.x,end.y);}41r0=r*2/5;hDC->Arc(org.x-r0,org.y-r0,org.x+r0,org.y+r0,org.x+(int)(r0*sin(PI/3)),org.y-(int)(r0*cos(PI/3)),org.x-(int)(r0*sin(2*PI/3)),org.y+(int)(r0*cos(2*PI/3)));//畫內(nèi)側(cè)圓弧sita=PI/6+PI*4/15/5; //是字符串“黃鶴樓唐.崔顥”的輸出角度fontSize0=fontSize=(r-r0)/7; //字體的大小r0=r-20; //半徑逐步減小for(i=0;i<7;i++) //輸出字符串“黃鶴樓唐.崔顥”的過程//其中,文字是逐步變小的,每個(gè)文字位置所處的半徑也是逐步變小的,這個(gè)工作由循環(huán)中的CreateMyFont語句來完成,其中涉及到了文字大小計(jì)算(“fontSize-5”)的參數(shù)。{LPCWSTRoutInfo=&title[i];//逐步取詩的標(biāo)題字fontSize-=3;font=CreateMyFont(_T("楷體_GB2312"),fontSize-5,

(int)(-(sita+PI/15)*180/PI));//創(chuàng)建字體hDC->SelectObject(font);//將創(chuàng)建的字體句柄選入設(shè)備環(huán)境begin.x=org.x+(int)(r0*cos(sita));begin.y=org.y-(int)(r0*sin(sita));//計(jì)算輸出文字的坐標(biāo)hDC->TextOut(begin.x,begin.y,outInfo,1);//輸出文字r0-=fontSize;//文字位置由外向內(nèi)移動(dòng)DeleteObject(font);}42for(sita=PI/6+PI*4/27-PI/40;sita<PI*5/6;sita+=PI*2/27)//角度從右向左,角度與以下計(jì)算位置及字體傾斜相配合,是為了輸出每一行詩句,按角度進(jìn)行循環(huán),實(shí)際上是計(jì)算每一行詩句的輸出角度,{fontSize=fontSize0;r0=r-20; j++; color=0;for(i=0;i<7;i++)//負(fù)責(zé)詩句的輸出,包括字體大小的計(jì)算及顏色值的計(jì)算{color+=255/7; //設(shè)定color值的變化規(guī)則hDC->SetTextColor(RGB(255-color,0,color));

//將color的變化體現(xiàn)在顏色設(shè)定中LPCWSTRoutInfo=&poem[j][i];fontSize-=3; //設(shè)定字體大小變化規(guī)則font=CreateMyFont(L"華文行楷",fontSize,(int)(((sita-PI/2)*180/PI))%360);hDC->SelectObject(font);//將上一句所創(chuàng)建的字體選入DCbegin.x=org.x+(int)(r0*cos(sita));//計(jì)算輸出點(diǎn)的坐標(biāo)begin.y=org.y-(int)(r0*sin(sita));hDC->TextOut(begin.x,begin.y,outInfo,1);//輸出文字r0-=fontSize;DeleteObject(font);Sleep(100);//輸出一個(gè)文字暫停.1秒}}ReleaseDC(hDC);//結(jié)束繪圖}43【例3-6】繪制如圖3-7所示的文字畫面。對于此界面,細(xì)心觀察會(huì)發(fā)現(xiàn),文字的展示是有規(guī)律的:文字由大到小由小到大漸變顏色也是一個(gè)漸變過程文字在一定規(guī)則的曲線上分布輸出文字的時(shí)候,只要在特定曲線上計(jì)算好坐標(biāo)點(diǎn)、計(jì)算好文字的大小按一定的規(guī)則設(shè)定文字的顏色

所進(jìn)行的計(jì)算,主要就是簡單的特定曲線方程的計(jì)算,這些曲線方程,大家在中學(xué)階段都學(xué)習(xí)過。44具體步驟如下:1:創(chuàng)建基于對話框的應(yīng)用程序3_6,在對話框類中增加如下變量: CDC*hDC; //定義設(shè)備環(huán)境句柄.2:由于需要用到圓周率,在3_6Dlg.cpp文件中宏定義一個(gè)變量Pi及創(chuàng)建字體函數(shù)CreateFont:#definePi3.1415926HFONTCreateFont(int,int); //創(chuàng)建字體函數(shù)的原型聲明.3:編寫創(chuàng)建字體的CreateFont函數(shù):HFONTCreateFont(intnCharHeight,intnCharWidth){ HFONThFont; constWCHARfont_name[]=L"Arial"; hFont=CreateFont( //定義字體句柄 nCharHeight, //字體高度 nCharWidth, //寬度 0, //文本傾斜度為0,表示水平45 0, //字體傾斜度為0 800, //字體粗度.400為正常 0, //是否為斜體 0, //無下劃線 0, //無刪除線 ANSI_CHARSET, //表示所用的字符集為 OUT_DEFAULT_PRECIS, //刪除精度為缺省值 CLIP_DEFAULT_PRECIS, //裁剪精度為缺省值 DEFAULT_QUALITY, //輸出質(zhì)量為缺省值 DEFAULT_PITCH|FF_DONTCARE,//字間距和字體使用缺省值 font_name); //字體名稱 if(hFont==NULL)returnNULL; elsereturnhFont;}464:編寫刷新函數(shù)OnPaint在刷新函數(shù)OnPaint中添加如下代碼:constWCHARlpsz_1[]=L"欲窮千里目更上一層樓";intnCharlen=(int)wcslen(lpsz_1); //定義字符串長度變量intX,Y,i;intnCharHeight; //定義字符高度的變量CPaintDCdc(this); //用于繪制的設(shè)備上下文hDC=GetDC(); //獲得設(shè)備環(huán)境指針hDC->SetMapMode(MM_ANISOTROPIC); //設(shè)置映射模式hDC->SetWindowExt(800,600); //設(shè)置窗口范圍hDC->SetViewportExt(800,600); //設(shè)置視口范圍HFONThF=NULL;//輸出字體大小線形變化的藝術(shù)字.for(i=0;i<nCharlen;i++){nCharHeight=40-(int)((40.0-15.0)/(nCharlen-1)*i);//計(jì)算字符的高度

X=i*30; //字符輸出位置的X坐標(biāo)

Y=50-nCharHeight/2; //字符輸出位置的Y坐標(biāo)47hDC->SetTextColor(RGB(255-i*15,0,0)); //設(shè)置字符的顏色hF=CreateFont(nCharHeight,15); //定義字體hDC->SelectObject(hF);hDC->TextOut(X+50,Y,&lpsz_1[i],1);}for(i=0;i<nCharlen;i++){nCharHeight=15+(int)((40.0-15.0)/(nCharlen-1)*i);

X=i*30;Y=75-nCharHeight/2;hDC->SetTextColor(RGB(105+i*15,0,0));hF=CreateFont(nCharHeight,15); //定義字體

hDC->SelectObject(hF);hDC->TextOut(X+50,Y,&lpsz_1[i],1);}48//輸出字體大小雙線形變化的藝術(shù)字.for(i=0;i<nCharlen;i++){nCharHeight=(int)(-1.23*i*i+11.07*i+15.1);//計(jì)算字符的高度X=i*30;Y=120-nCharHeight/2; //字符輸出位置的Y坐標(biāo)

hDC->SetTextColor(RGB(0,255-i*15,0)); //設(shè)置字符的顏色

hF=CreateFont(nCharHeight,15); //定義字體

hDC->SelectObject(hF);hDC->TextOut(X+50,Y,&lpsz_1[i],1);}for(i=0;i<nCharlen;i++){nCharHeight=(int)(0.9*i*i+15); //計(jì)算字符的高度X=i*30;Y=180-nCharHeight/2; //字符輸出位置的Y坐標(biāo)

hDC->SetTextColor(RGB(0,0,255-i*20)); //設(shè)置字符的顏色

hF=CreateFont(nCharHeight,15); //定義字體49hDC->SelectObject(hF);hDC->TextOut(X+50,Y,&lpsz_1[i],1);}//輸出位置為正弦波的字符串.for(i=0;i<nCharlen;i++){nCharHeight=30; //字符的高度

X=i*30; //字符輸出位置的X坐標(biāo)

Y=(int)(250-40*sin(2*Pi/(nCharlen-1)*i)); //字符輸出位置的Y坐標(biāo)

hDC->SetTextColor(RGB(0,255-i*15,255-i*20));//設(shè)置字符的顏色

hF=CreateFont(nCharHeight,15); //定義字體

hDC->SelectObject(hF);

hDC->TextOut(X+50,Y,&lpsz_1[i],1);}//輸出位置為余弦波的字符串.for(i=0;i<nCharlen;i++){nCharHeight=30; //字符的高度

X=i*30; //字符輸出位置的X坐標(biāo)

Y=(int)(360-40*cos(2*Pi/(nCharlen-1)*i)); //字符輸出位置的Y坐標(biāo)50hDC->SetTextColor(RGB(150,50,255-i*20)); //設(shè)置字符的顏色hF=CreateFont(nCharHeight,15); //定義字體hDC->SelectObject(hF);hDC->TextOut(X+50,Y,&lpsz_1[i],1);}//輸出位置為圓形的字符串.for(i=0;i<nCharlen;i++){nCharHeight=30; //字符的高度X=(int)(420+70*cos(2*Pi/(nCharlen)*i)); //字符輸出位置的X坐標(biāo)

Y=(int)(300+70*sin(2*Pi/(nCharlen)*i)); //字符輸出位置的Y坐標(biāo)

hDC->SetTextColor(RGB(255-i*15,100,0)); //設(shè)置字符的顏色

hF=CreateFont(nCharHeight,15); //定義字體

hDC->SelectObject(hF);

hDC->TextOut(X+50,Y,&lpsz_1[i],1);}

51//輸出位置為半圓形.for(i=0;i<nCharlen;i++){nCharHeight=30-i*2; //字符的高度

X=(int)(420-80*cos(-Pi/(nCharlen)*i)); //字符輸出位置的X坐標(biāo)

Y=(int)(120+80*sin(-Pi/(nCharlen)*i)-nCharHeight/2); //Y坐標(biāo)

hDC->SetTextColor(RGB(255-i*15,100,255-i*15));//設(shè)置字符的顏色

hF=CreateFont(nCharHeight,15); //定義字體

hDC->SelectObject(hF);hDC->TextOut(X+50,Y,&lpsz_1[i],1);}DeleteObject(hF); //刪除字體句柄ReleaseDC(hDC); //刪除設(shè)備用戶指針52【3-7】旋轉(zhuǎn)古詩,界面效果如下圖所示。其中文字是動(dòng)畫的。讀者可以先運(yùn)行一下代碼,看一下運(yùn)行效果,然后基于這個(gè)效果,自行編寫程序,看看你是否能完成這樣的演示效果。531:創(chuàng)建一個(gè)基于對話框的應(yīng)用程序3_7,由于這個(gè)應(yīng)用程序涉及到文字輸出、界面背景顏色、畫筆、字體等信息,因此需要添加如下變量: CDC*hDc; //定義DC HFONThf_black; //字體句柄 HBRUSHhb; //畫刷句柄 TEXTMETRICtm; //定義字體信息結(jié)構(gòu)體變量2:從圖3-8可以看出,有再圓周上輸出的文字,因此需要在3_7Dlg.cpp文件中添加PI的定義:#definePI3.14159263:刷新函數(shù)OnPaint參考代碼如下:voidCMy37Dlg::OnPaint(){CPaintDCdc(this);//用于繪制的設(shè)備上下文LPCWSTRlpsz_1[4]={L"故人西辭黃鶴樓",L"煙花三月下?lián)P州", L"孤帆遠(yuǎn)影碧空盡",L"唯見長江天際流"};54inth=0; //h為螺旋線曲率半徑intheight=40,x,y,x0=425,y0=300; //height為字體高度hDc=GetDC(); //創(chuàng)建DChb=CreateSolidBrush(RGB(100,0,200)); //設(shè)置畫刷顏色hf_black=CreateFont(height,0,0,500,FW_HEAVY,//創(chuàng)建字體 0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE,L"粗體字");hDc->SelectObject(hb); //將畫刷選入當(dāng)前設(shè)備環(huán)境hDc->Rectangle(0,0,2880,1920); //創(chuàng)建矩形區(qū)hDc->SetBkColor(RGB(100,0,200)); //設(shè)置背景顏色hDc->SetTextColor(RGB(0,255,255));//設(shè)置文本顏色為天藍(lán)色hDc->GetTextMetrics(&tm); //獲取字體信息hDc->SelectObject(hf_black);//將前面創(chuàng)建的字體選入當(dāng)前設(shè)備環(huán)境55for(inti=0;i<4;i++) //通過循環(huán)輸出四句詩詞for(intj=0;j<7;j++){hDc->TextOut((int)(500-50*i),(int)(150+50*j),lpsz_1[i]+j,1);Sleep(100);}for(inti=0;i<4;i++) //通過循環(huán)擦除詩句內(nèi)容for(intj=0;j<7;j++){x=350+50*i;y=150+50*j;hDc->SetTextColor(RGB(100,0,200)); //設(shè)置顏色為背景顏色hDc->TextOut(x,y,lpsz_1[i]+j,1);//以背景顏色輸出文字,達(dá)到擦除文字的效果hDc->SetTextColor(RGB(0,255,0));Sleep(100);}

56for(intk=0;k<3;k++){height=40;for(intg=0;g<200;g=g+5) //做螺旋運(yùn)動(dòng){if(k==1)h=g;hDc->Rectangle(0,0,2880,1920);for(inti=0;i<4;i++)for(intj=0;j<7;j++){ hDc->SetTextColor(RGB(0,255,0)); hDc->TextOut((int)(x0-(200-2*(h+1))*cos(h*PI/14)),(int)(y0+(200-2*(h+1))*sin(h*PI/14)),lpsz_1[i]+j,1); h++; //逐漸擴(kuò)大曲率半徑}if(k==0) Sleep(100); //為增強(qiáng)趣味性,這里設(shè)定不同的延遲時(shí)間if(k==1)Sleep(150);if(k==2)Sleep(50);57hf_black=CreateFont(height,0,0,500, //創(chuàng)建輸出文字的字體 FW_HEAVY,0,0,0,ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE, L"粗體字");height=height-2; //字體高度遞減hDc->SelectObject(hf_black);}}hDc->Rectangle(0,0,2880,1920);for(inti=0;i<4;i++) //結(jié)尾處,按圓狀輸出詩for(intj=0;j<7;j++){x=350+50*i;y=150+50*j;

hDc->SetTextColor(RGB(0,255,0));hDc->TextOut((int)(x0-220*cos(h*PI/14)),(int)(y0+220*sin(h*PI/14)),lpsz_1[i]+j,1);h++;}58hDc->SetTextColor(RGB(200,200,0));for(inti=0;i<2;i++) //在中間輸出詩句for(intj=0;j<7;j++){hDc->TextOut(350+50*i,150+50*j,lpsz_1[3-i]+j,1);hDc->TextOut(500-50*i,150+50*j,lpsz_1[i]+j,1);Sleep(100);}ReleaseDC(hDc);}

第4章

Windows應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng)

掃描碼是依賴于具體設(shè)備的,為達(dá)到設(shè)備無關(guān)性的要求,往往使用與具體設(shè)備無關(guān)的虛擬碼,虛擬碼是由Windows系統(tǒng)定義的與設(shè)備無關(guān)的鍵的標(biāo)識(shí)由于鍵盤的輸入產(chǎn)生一條消息掃描碼、虛擬碼以及其他與擊鍵有關(guān)的消息設(shè)備驅(qū)動(dòng)程序截取鍵的掃描碼翻譯虛擬碼它含鍵盤上的鍵對應(yīng)一個(gè)唯一的標(biāo)識(shí)值(掃描碼)按下或釋放某鍵時(shí)產(chǎn)生取出鍵盤消息進(jìn)行處理消息設(shè)備驅(qū)動(dòng)程序把消息放到系統(tǒng)的消息隊(duì)列中Windows

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論