《第10章 字體與文本》由會(huì)員分享,可在線閱讀,更多相關(guān)《第10章 字體與文本(22頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第10章 字體與文本顯示圖形系統(tǒng)中為了獲得當(dāng)前運(yùn)行程序的相關(guān)信息,往往需要在屏幕上顯示文本,D3D 的功能擴(kuò)展ID3DXFont()對(duì)此提供了方便的解決方法。.二維文本繪制通過(guò)D3D功能對(duì)象ID3DXFont可以繪制文本,主要使用:ID3DXfont:DrawText()和ID3DXFont:GetDevice()函數(shù)。1.創(chuàng)建ID3DXFont對(duì)象使用接口ID3DXFont繪制文本,首先需要通過(guò)函數(shù)D3DXCreateFont()函數(shù)通過(guò)Windows字體和D3D設(shè)備指針創(chuàng)建ID3DXFont對(duì)象。ID3DXCreateFont()函數(shù)聲明HRESULT D3DXCreateFont(LPD
2、IRECT3DDEVICE9 pDevice,INT Height,UINT Width,UINT Weight,UINT MipLevels,BOOL Italic,DWORD CharSet,DWORD OutputPrecision,WORD Quality,DWORD PitchAndFamilyLPCTSTR pFacename,LPD3DXFONT*ppFont);ID3DXCreateFont()函數(shù)參數(shù)說(shuō)明pDevice:表示一個(gè)有效的D3D設(shè)備指針Height:表示創(chuàng)建字體的邏輯高度,如果等于則使用字體的默認(rèn)高度。Width:表示創(chuàng)建字體的平均邏輯寬度,如果等于,則使用字體的
3、默認(rèn)寬度。Weight、MipLevelsItalic:表示字體的權(quán)輿和過(guò)濾屬性,一般取默認(rèn)值0。CharSet:表示創(chuàng)建字體所屬的字符集合,如果設(shè)為D3FAULT_CHARSET,則函數(shù)將自動(dòng)尋找與指定字體相符的字符集合。ID3DXCreateFont()函數(shù)參數(shù)說(shuō)明(續(xù))OutputPrecision:指定字符的輸出精度,通常情況下將該值設(shè)為OUT_DEFAULT_PRECIS。Quality:指定字符的輸出質(zhì)量,通常情況下將該值設(shè)為D3FAULT_QUALITY。PitchAndFamily:指定字休的索引號(hào)pFaceName是指向表示字體名稱的字符串。ppFont:存儲(chǔ)新創(chuàng)建的字體指針
4、。通過(guò)Arial字體創(chuàng)建一個(gè)ID3DXFont對(duì)象LPD3DXFONT g_pFont =0;if(FAILED(D3DXCreateFont(g_pd3dDevice,0,0,0,0,0,0,0,0,LArial,&g_pFont)return E_FAIL;2.使用ID3DXFont對(duì)象繪制二維文本創(chuàng)建了ID3DXFont對(duì)象后,就可以使用其接口函數(shù)ID3DXFont:DrawText()在指定位置繪制二維文本。該函數(shù)支持ANSI雙字節(jié)字符串。ID3DXFont:DrawText()函數(shù)聲明INT ID3DXFont:DrawText(LPD3DXSPRITE pSprite,LPCSTR
5、 pSting,INT Count,LPRECT pRect,DWORD Format,D3DCOLOR Color);ID3DXFont:DrawText()參數(shù)說(shuō)明pSprite:指定字符串所屬的ID3DXSprite對(duì)象接口,可置為默認(rèn)值為,表示在當(dāng)前窗口繪制字符串。pSting:指定將要繪制的字符串。Count:指定繪制字符的個(gè)數(shù),如果等于-1,則函數(shù)將自動(dòng)繪制到字符串結(jié)束為止。pRect:指定繪制字符串的矩形區(qū)域位置。Format:指定字符串在pRect指定的矩形區(qū)域內(nèi)的擺放屬性,這些屬性可以通過(guò)位去處“或”(|)聯(lián)合使用。Color:指定字符串的顏色值,屬于D3DCOLOR結(jié)構(gòu)。常
6、用字符串排放屬性擺放屬性說(shuō)明DT_BOTTOM字符串位于pRect的底部,該心性只能與DT_SINGLELINE共存DT_CALCRECT 根據(jù)字符串的長(zhǎng)度更改pRect指定的矩形區(qū)域的大小。DT_CENTER字符串位pRect的水平居中DT_LEFT字符串向pRect的左邊對(duì)齊DT_NOCLIP不對(duì)字符串進(jìn)行裁剪常用字符串排放屬性(續(xù)表)擺放屬性說(shuō)明DT_RIGHT字符串向pRect右方對(duì)齊DT_SINGLELINE 將字符串單行顯示,忽略換行標(biāo)記。DT_TOP字符串位于pRect的頂端DT_VCENTER字符串位于pRect垂直居中下列代碼在窗口客戶區(qū)中央顯示一行白色的文字:Welcome
7、 Direct3D!WCHAR*strText =LWelcome Direct3D!;g_pFont-DrawText(NULL,strText,(int)wcslen(strText),&clientRect,DT_SINGLELINE|DT_NOCLIP|DT_CENTER|DT_VCENTER,0 xffffffff);3.ID3DXFont其他相關(guān)接口函數(shù)函數(shù)ID3DXFont:GetDevice()能夠獲得與ID3DXFont相關(guān)聯(lián)的D3D設(shè)備指針,該函數(shù)聲明如下:.三維文本繪制1.創(chuàng)建三維文本網(wǎng)格模型在D3D中,三維物體的顯示是通過(guò)網(wǎng)格模型來(lái)實(shí)現(xiàn)的,顯示三維物體的關(guān)鍵在于生成該網(wǎng)
8、格模型。三維文本也不例外,顯示三維文本同樣需要該文本所對(duì)應(yīng)的網(wǎng)格模型。D3D為此提供了功能庫(kù)函數(shù)D3DXCreateText(),它可以方便地創(chuàng)建一個(gè)包含具體文本的網(wǎng)格模型。D3DXCreateText()聲明HRESULT D3DXCreateText(LPDIRECT3DDEVICE9pDevice,HDC hDC,LPCTSTR pText,FLOAT Deviation,FLOAT Extrusion,LPD3DXMESH*ppMesh,LPD3DXBUFFER*ppAdjacency,LPGLYPHMETERICSFLOAT pGlyphMetrics)D3DXCreateText(
9、)參數(shù)說(shuō)明LpDevice:用于創(chuàng)建網(wǎng)格的3D設(shè)備指針hDC:表示設(shè)備描述表。pText:指定具體文本字符串Deviation:指定弦偏差的最大值。Extrusion:指定文本在z軸負(fù)方向突出的總量。ppMesh:指向生成字體網(wǎng)格模型地址的指針。ppAdjacency:指向包含相關(guān)輸出信息緩沖區(qū)的指針,可以為NULL。pGlyphMetrics:指向GLYPHMETRICSFLOAT結(jié)構(gòu)體數(shù)組指,該數(shù)組可以包括所有字符的相關(guān)數(shù)據(jù)。創(chuàng)建文本“三維字體”的網(wǎng)格模型的代碼/創(chuàng)建設(shè)備描述表HDC hdc=CreateCompatibleDC(NULL);if(hdc=NULL)return E_OUT
10、OFMEMORY;/創(chuàng)建字體HFONT hFont=CreateFont(0,0,0,0,FW_BOLD,false,false,false,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,LArial);/將字體選進(jìn)設(shè)備描述表SelectObject(hdc,hFont);2.繪制三維文本網(wǎng)格模型創(chuàng)建好文本的網(wǎng)格模型之后,就可以使用ID3DXMesh的接口函數(shù)DrawSubset()將其繪制出來(lái),在繪制之前需要注意設(shè)置合適的世界矩陣,這時(shí)雖然是繪制
11、三維文本,但實(shí)質(zhì)上就是繪制一個(gè)三維物體,所以為三維文本設(shè)置世界矩陣是必不可少的。繪制三維文本的代碼片段VOID SetWorldMatrix()/創(chuàng)建并設(shè)置世界矩陣 D3DXMATRIX matWorld;D3DXMATRIX matTrans;D3DXMatrixTranslation(&matWorld,-1.75f,0.0f,0.0f);/平移 g_pd3dDevice-SetTransform(D3DTS_WORLD,&matWorld);pTextMesh-DrawSubset(0);小結(jié)文本繪制是圖形程序設(shè)計(jì)中不可或缺的一部分,正確適當(dāng)?shù)剡M(jìn)行文本繪制在圖形程序設(shè)計(jì)中具有非常重要的實(shí)際意義。本章通過(guò)兩個(gè)示例程序詳細(xì)介紹了在D3D中如何進(jìn)行二維和三維文本的繪制。二信字體的顯示比較簡(jiǎn)單,可以結(jié)合示例程序進(jìn)一步加深理解。三維字體的顯示關(guān)鍵在于構(gòu)造出字符串所對(duì)應(yīng)的網(wǎng)格模型,然后在場(chǎng)景中渲染該三維模型即可。