Visual C++語(yǔ)言:第5章 文字與字體_第1頁(yè)
Visual C++語(yǔ)言:第5章 文字與字體_第2頁(yè)
Visual C++語(yǔ)言:第5章 文字與字體_第3頁(yè)
Visual C++語(yǔ)言:第5章 文字與字體_第4頁(yè)
Visual C++語(yǔ)言:第5章 文字與字體_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五章文本與字體,內(nèi)容提要,設(shè)置文本的設(shè)備環(huán)境 文本的輸出過程 文本操作實(shí)例,5.1. 設(shè)置文本的設(shè)備環(huán)境,1. 有關(guān)的基本概念,Windows中所顯示的任何內(nèi)容,在一定意義上,都可看成借助GDI繪制圖形實(shí)體。 文本輸出使用預(yù)定義好的特殊圖形元素字體集。 字體描述了所要顯示的文本文字的大小、類型和外形。 Windows 系統(tǒng)提供了七種基本字體,并允許用戶創(chuàng)建新的字體,文本操作的要點(diǎn): 獲得文本句柄; 設(shè)置字體、字符大小、字符顏色等屬性; 將這些屬性選入設(shè)備環(huán)境,2. Windows提供的七種基本字體,ANSI_FIXED ANSI標(biāo)準(zhǔn)的固定寬度的字體 ANSI_VAR ANSI標(biāo)準(zhǔn)的可變寬度的

2、字體 DEFAULT_GUI當(dāng)前GUI的缺省字體 OEM_FIXED 標(biāo)準(zhǔn)原設(shè)備制造商(OEM)提供 DEVICE_DEFAULT當(dāng)前圖形設(shè)備的字體 SYSTEM_FIXEDWindows的標(biāo)準(zhǔn)固定寬度的字體 SYSTEM Windows提供的可變寬度的字體,常作為缺省字體 Win用它作為系統(tǒng)界面字體,3. 選擇系統(tǒng)字體的步驟,1) 定義字體句柄變量: HFONT hF; /hF為字體的句柄 (2) 調(diào)函數(shù)GetStockObject獲得系統(tǒng)字體句柄, 它返回的是系統(tǒng)的缺省字體 hF= GetStockObject( ); (3) 調(diào)函數(shù)SelectObject將字體選入設(shè)備環(huán)境 Select

3、Object(hdc,hF,4.創(chuàng)建自定義字體,調(diào)用函數(shù)CreateFont可創(chuàng)建自定義字體,HFont=CreateFont ( int nHeight, /字體高度,0采用系統(tǒng)缺省值,使用邏輯單位 int nWidth,/字體寬度,取0則取最佳高寬比值 int nEscapement, /每行文字相對(duì)于頁(yè)底的角度,單位為0.1度 int nOrientation, /每個(gè)文字相對(duì)于頁(yè)底的角度,單位為0.1度 nWeight, /字體粗細(xì)度,取值范圍為01000 DWORD Dwltalic, /若字體傾斜,則取非零 DWORD dwUnderline,/若帶下劃線,則取非零 DWORD d

4、wStrikeout,/若帶刪除線,則取非零,DWORD dwCharset, /字體所屬字符集 DWORD dwOutputPrecision,/輸出精度,缺省值OUT_DEFAULT_PRECIS DWORD dwClipPrecision, /剪裁精度,缺省值CLIP_DEFAULT_PRECIS DWORD dwQuality,/輸出質(zhì)量,缺省值DEFAULT_QUALITY DWORD dwPitchAndFamily, /字體的間距及字體的系列,缺省值DEFAUL_PITCH DWORD lpszFacename /字體名,可選的系統(tǒng)字符集: ANSI_CHARSET OEM_CH

5、ARSET SYMBOL_CHARSET DEFAULT_CHARSET SHIFTJIS_CHARSET,crColor為設(shè)置的顏色,設(shè)置字體和背景顏色,設(shè)置字體顏色函數(shù): SetTextColor(hdc,crColor); 設(shè)置背景顏色函數(shù): SetBkColor(hdc,crColor,5.2. 文本的輸出過程,1. 文本的輸出步驟,獲取字體信息 格式化文本 確定后續(xù)文本坐標(biāo) 確定換行時(shí)文本坐標(biāo) 調(diào)用函數(shù)輸出文本,2. 獲取字體信息,輸出文本之前,必須獲取字體的信息,如字符高度等,以確定輸出格式和下一行字符的位置。 調(diào)用GetTextMetrics()獲取字體的信息 GetTextMe

6、trics (hdc, /字符高度 LONG tmAscent; /字符基線以上高度 LONG tmDescent; /字符基線以下高度 LONG tmInternalLeading; /包含在tmHeight值內(nèi)的垂直大小,通常被一些大寫字母上注音符號(hào)占據(jù)。 LONG tmExternalLeading;/行間的間隔 LONG tmAveCharWidth;/平均字符寬度 LONG tmMaxCharWidth;/最大字符寬度 LONG tmWeight; /字符的粗細(xì)度 LONG tmOverhang;/合成字體間附加的寬度 LONG tmDigitizedAspectX; /為輸出設(shè)備設(shè)

7、計(jì)的X軸方向 LONG tmDigitizedAspectY; /為輸出設(shè)備設(shè)計(jì)的Y軸方向 BCHAR tmFirstChar;/字體中第一個(gè)字符 BCHAR tmLastChar; /字體中最后一個(gè)字符 BCHAR tmDefaultChar; /字體中所沒有字符的替代字符 BCHAR tmBreakChar;/作為分割符的字符 BYTE tmItalic; /非0則為斜體 BYTE tmUnderlined; /非0則表示有下劃線 BYTE tmStruckOut; /非0則表示帶刪除線 BYTE tmPitchAndFamily; /字體間距和字體族 BYTE tmCharSet; /字

8、符集 TEXTMETRIC,BooL GetTextExtentPoint32 ( HDC hdc, LPCTSTR lpszString,/指定的字符串 int nLength, /字符串中的字符數(shù) LPSIZE lpSize /為返回加字符串寬度及高度的SIZE數(shù)據(jù)結(jié)構(gòu)的地址 ) 例如,X軸起始坐標(biāo)為cx0,后續(xù)文本起始坐標(biāo)cx1為: cx1=cx0+size.cx,SIZE數(shù)據(jù)結(jié)構(gòu)的定義 typedef struct tagSIZE LONG cx; LONG cy; SIZE,3. 格式化文本,確定后續(xù)文本坐標(biāo),由函數(shù)GetTextExtentPoint32 獲取當(dāng)前的字符串的寬度,并

9、存于SIZE,確定換行時(shí)文本坐標(biāo) 在tm指向的TEXTMETRIC結(jié)構(gòu)中,存有: 字符高度tmHeight 行間隔tmExternalLeading 。 換行時(shí),新一行文本的y坐標(biāo)的增量值為: cy=tm.tmHeight+tm.tmExternalLeading,3. 文本輸出,常用的文本輸出函數(shù)TextOut,原型如下: BOOL TextOut ( HDC hdc, int X, int Y, /字符串的起始坐標(biāo) LPCTSTR lpstring, /被顯示的字符串 int nCount /字符串的字節(jié)數(shù),5.3. 文本操作實(shí)例,例5-1】在用戶窗口上輸出幾行字符串,每當(dāng)窗口接收到WM_

10、PAINT消息后,顯示的文本都被刷新,include #include #include long WINAPI WndProc( HWND hWnd, UINT iMessage, UINT wParam, LONG lParam ); BOOL InitWindowsClass(HINSTANCE hInstance); BOOL InitWindows(HINSTANCE hInstance,int nCmdShow); HWND hWndMain,主函數(shù) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,

11、LPSTR lpCmdLine, int nCmdShow) MSG Message; if(!InitWindowsClass(hInstance)return FALSE; if(!InitWindows(hInstance,nCmdShow)return FALSE; while(GetMessage(,消息處理函數(shù) long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) static long nXChar,nCaps,nYChar; HDC hDC; /定義指向設(shè)備上下文的句柄 short x; TEX

12、TMETRIC tm; short LnCount=6; PAINTSTRUCT PtStr; /定義指向包含繪圖信息的結(jié)構(gòu)變量 static char *textbuf= This is the First line, This is the second line, This is the third line, This is the fourth line, This is the fifth line, This is the sixth line,輸出的 文本內(nèi)容,switch(iMessage) /處理消息 case WM_CREATE:/處理窗口創(chuàng)建消息 hDC=GetDC(h

13、Wnd) ; /獲取當(dāng)前設(shè)備表句柄 GetTextMetrics(hDC,BOOL InitWindowsClass(HINSTANCE hInstance)/初始化窗口類 WNDCLASS WndClass; ; WndClass.style=CS_HREDRAW|CS_VREDRAW; return RegisterClass(,BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) /初始化窗口 HWND hWnd; hWnd=CreateWindow(WinText, /生成窗口 文本顯示示例程序, WS_OVERLAPPEDWINDOW,

14、 .; NULL); if(!hWnd)return FALSE; hWndMain=hWnd; ShowWindow(hWnd,nCmdShow);/顯示窗口 UpdateWindow(hWnd); return TRUE;,例5-2】本程序在窗口中分五行分別顯示五行文本,以說明在窗口的用戶區(qū)中格式及輸出文本的方法,25,include #include #include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE h

15、PrevInst,LPSTR lpszCmdLine,int nCmdShow) HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName = 文本輸出; char lpszTitle= EXAMPLE FOR THE TEXT OUTPUT; wndclass.style = 0; ; wndclass.lpszClassName = lpszClassName,if( !RegisterClass(,LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPAR

16、AM lParam) HDC hdc; HFONT hF_black,hF_big;/定義兩種字體句柄 PAINTSTRUCT ps; TEXTMETRIC tm;/定義一個(gè)TEXTMETRIC結(jié)構(gòu),用以記錄字體信息 char lpsz_1=“這是一行紅色的、字體為SYSTEM_FONT的文字, 紅色代表未來?!? char lpsz_2=“現(xiàn)在顯示的是自定義字體,顏色為綠色, 綠色代表生機(jī)勃勃?!? char lpsz_3=“現(xiàn)在展現(xiàn)在您面前的是藍(lán)色的粗體字, 藍(lán)色代表廣闊的海洋和天空。; char lpsz_4=“當(dāng)前字體為大號(hào)、斜體并帶有下劃線的文字。”; char lpsz_5=“現(xiàn)在

17、您掌握了字體的操作了嗎?”; char lpsz_6=“祝您成功,int X=0,Y=0; SIZE size; /定義一個(gè)SIZE類型的結(jié)構(gòu) hF_black=CreateFont /創(chuàng)建自定義字體“粗體字” ( 20, /字體的高度 0, /取最佳高寬比的寬度值 0, /文本的傾斜度為0,表示水平 0, /字體的傾斜度為0 FW_HEAVY, /字體的粗度,F(xiàn)W_HEAVY為最粗 0, /非斜體字 0, /無下劃線 0, /無刪除線 ANSI_CHARSET, /用ANSI_CHARSET字符集 OUT_DEFAULT_PRECIS, /輸出精度為缺省精度 CLIP_DEFAULT_PRE

18、CIS, /剪裁精度為缺省精度 DEFAULT_QUALITY, /輸出質(zhì)量為缺省值 DEFAULT_PITCH|FF_DONTCARE,/字間距和字體系列使用缺省值 “粗體字” /字體名稱,hF_big=CreateFont/創(chuàng)建新字體大號(hào)字 ( 30,/字體高度 0, 0, 0, FW_NORMAL, 1,/定義斜體 1,/定義輸出時(shí)帶下劃線 0, ANSI_CHARSET,/所使用的字符集 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, 大號(hào)字,switch(mess

19、age) case WM_PAINT: hdc=BeginPaint(hwnd, /輸出文本3,X=0; /計(jì)算下一行起始坐標(biāo) Y=Y+tm.tmHeight+20*tm.tmExternalLeading; SelectObject(hdc,hF_big); /選自定義字體hF_big SetTextColor(hdc,RGB(155,155,155);/置文本顏色為灰色 Y=Y+tm.tmHeight+20*tm.tmExternalLeading;/Y坐標(biāo)加大 TextOut(hdc,X,Y,lpsz_4,strlen(lpsz_4);/輸出文本4 SetTextColor(hdc,RG

20、B(255,0,0);/設(shè)文本顏色為紅色 X=0; /下一行的坐標(biāo) Y=Y+tm.tmHeight+30*tm.tmExternalLeading; TextOut(hdc,X,Y,lpsz_5,strlen(lpsz_5); /輸出文本5 GetTextExtentPoint32(hdc,lpsz_5,strlen(lpsz_5,case WM_DESTROY: DeleteObject(hF_black);/退出窗口時(shí)刪除自定義字體 DeleteObject(hF_big); PostQuitMessage(0); break; default: return DefWindowProc(

21、hwnd,message,wParam,lParam); return 0;,5-7】在窗口中顯示出26個(gè)英文字母,從左向右字母依次位置提高10個(gè)象素單位,并且顏色變?yōu)榧t色,然后回到正常位置;當(dāng)?shù)竭_(dá)最右端后改變方向從右向左依次變成紅色并位置提高10個(gè)象素單位。在窗口的第二行顯示26個(gè)字母,字體從正常到斜體,顏色從黑色到天藍(lán)色不斷變換。如圖所示,用nChar標(biāo)志紅 色跳起字母在 26個(gè)字母的位置,本例題要解決動(dòng)態(tài)顯示問題,用設(shè)定定時(shí)器維持循環(huán)switch(iMessage)case WM_CREATE:SetTimer(hWnd,1,200,NULL); /設(shè)定定時(shí)器.每0.2秒發(fā)出WM_TIM

22、ER消息.break;case WM_PAINT:/處理繪圖消息.case WM_TIMER:InvalidateRect(hWnd,NULL,1);/刷新用戶區(qū).break;,首先處理第一行字符:在WM_PAINT消息處理程序中,在得到了設(shè)備環(huán)境句柄hDC后,調(diào)用用戶自定義的函數(shù) CreateFont(hDC,nHeight,bItalic); 第1個(gè)參數(shù)hDC設(shè)備環(huán)境句柄, 第2個(gè)參數(shù)nHeight字體高度, 第3個(gè)參數(shù)bItalic斜字體的標(biāo)志變量,實(shí)現(xiàn) 動(dòng)態(tài) 顯示,下面這段程序按照黑色的字體輸出從字符串開頭到當(dāng)前位置的字符串: Y=tm.tmExternalLeading+10;/設(shè)置

23、輸出字符的Y坐標(biāo) for(i=0;inChar;i+) SetTextColor(hDC,RGB(0,0,0);/設(shè)置字體的顏色為黑色 X=X+tm.tmAveCharWidth*2;/設(shè)置輸出字符的X坐標(biāo) TextOut(hDC,X,Y,/輸出從第0個(gè)到第nChar-1個(gè)字符,下面輸出當(dāng)前位置上的字符,當(dāng)前位置的字符位置提高10個(gè)象素單位,字體顏色為紅色: SetTextColor(hDC,RGB(255,0,0);/設(shè)置字體的顏色為紅色 X=X+tm.tmAveCharWidth*2;/設(shè)置輸出字符的X,Y坐標(biāo) Y=tm.tmExternalLeading; hF = CreateFont(hDC,40,0);/創(chuàng)建字體 SelectObject(hDC,hF);/選入字體 TextOut(hDC,X,Y,/輸出后面的字符,下面設(shè)置bR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論