標籤:des style blog http color get
1 DX中的建立字型的函數
HRESULT D3DXCreateFont( __in LPDIRECT3DDEVICE9 pDevice, __in INT Height, __in UINT Width, __in UINT Weight, __in UINT MipLevels, __in BOOL Italic, __in DWORD CharSet, __in DWORD OutputPrecision, __in DWORD Quality, __in DWORD PitchAndFamily, __in LPCTSTR pFacename, __out LPD3DXFONT *ppFont);
HRESULT D3DXCreateFontIndirect( __in LPDIRECT3DDEVICE9 pDevice, __in const D3DXFONT_DESC *pDesc, __out LPD3DXFONT *ppFont);
typedef struct D3DXFONT_DESC { INT Height; UINT Width; UINT Weight; UINT MipLevels; BOOL Italic; BYTE CharSet; BYTE OutputPrecision; BYTE Quality; BYTE PitchAndFamily; TCHAR FaceName;} D3DXFONT_DESC, *LPD3DXFONT_DESC;
可以看出函數D3DXCreateFont跟函數D3DXCreateFontIndirect 如出一轍,只不過是在D3DXCreateFontIndirect中用結構體D3DXFONT_DESC代替了諸多D3DXCreateFont中紛亂的參數。
下面詳細介紹一下各個參數的含義:
Height:字型的高度
Width:字型的寬度
Weight:字型的權重,範圍是0到1000,也就是字型的粗細,0最細,1000最粗
MipLevels:字型的過濾屬性,如果值是0或者D3DX_DEFAULT,那麼完整的mipmap鏈被建立,如果是1則紋理空間被等同的映射到螢幕空間。
Italic:布爾類型的變數,TRUE表示斜體,FALSE表示不是斜體
CharSet:字元集,一般設定為預設值DEFAULT_CHARSET
OutputPrecision:表示輸出文本的精度,就是指輸出的文字跟字型要求的寬度,高度,字元方向,行距,間距,字型類型等的契合度,通常設定為OUT_DEFAULT_PRECTS,具體可見WinGDI.h中的定義類型
Quality :輸出品質,一般也設定為DEFAULT_QUALITY
PitchAndFamily :間距和字型系列,一般設定為0。具體可以見WinGDI
#define DEFAULT_PITCH 0
#define FIXED_PITCH 1
#define VARIABLE_PITCH 2
#if(WINVER >= 0x0400)
#define MONO_FONT 8
#define FF_DONTCARE (0<<4) /* Don‘t care or don‘t know. */
#define FF_ROMAN (1<<4) /* Variable stroke width, serifed. */
/* Times Roman, Century Schoolbook, etc. */
#define FF_SWISS (2<<4) /* Variable stroke width, sans-serifed. */
/* Helvetica, Swiss, etc. */
#define FF_MODERN (3<<4) /* Constant stroke width, serifed or sans-serifed. */
/* Pica, Elite, Courier, etc. */
#define FF_SCRIPT (4<<4) /* Cursive, etc. */
#define FF_DECORATIVE (5<<4) /* Old English, etc. */
這樣的話我就可以在字型系列和字間隔之間隨意搭配,
FaceName:字型名稱,比如“宋體”,“華文彩雲”等
樣本:
//建立字型HR( D3DXCreateFont(m_pDevice,30,20,0,D3DX_DEFAULT,false,DEFAULT_CHARSET,OUT_TT_ONLY_PRECIS,DEFAULT_QUALITY,81,TEXT("宋體"),&m_pFont) );//繪製字型RECT rect;GetClientRect(m_hwnd,&rect);TCHAR buf[50] = {0};int nSize = _stprintf(buf,TEXT("FPS:%0.2f"),getFPS(dTime) );HR( m_pFont->DrawText(NULL,buf,nSize,&rect,DT_RIGHT,D3DCOLOR_XRGB(2,190,100)) );rect.top = 100;HR( m_pFont->DrawText(NULL,TEXT("不會磨滅的激情forever"),-1,&rect,DT_CENTER,D3DCOLOR_XRGB(200,90,100)) );rect.top = 200;HR( m_pFont->DrawText(NULL,TEXT("狂傲不羈的少年forever"),-1,&rect,DT_CENTER,D3DCOLOR_XRGB(255,120,10)) );
2 與之對應的GDI中的建立字型的函數
CreateFont,以及CreateFontIndirect
3 3D字型
D3DXCreateText函數,建立一個網格,繪製文字的時候就是繪製對應的網格
HRESULT D3DXCreateText( __in LPDIRECT3DDEVICE9 pDevice, __in HDC hDC, __in LPCTSTR pText, __in FLOAT Deviation, __in FLOAT Extrusion, __out LPD3DXMESH *ppMesh, __out LPD3DXBUFFER *ppAdjacency, __out LPGLYPHMETRICSFLOAT pGlyphMetrics);
pText:要顯示的內容
Deviation:TrueType字型輪廓的最大弦偏差,該值必須是非負弦偏差等於原始字型的一個設計單位,一般設定為0.001
Extrusion:沿Z軸負方向的字型深度
ppMesh:返回建立的字型網格
ppAdjacency:返回建立網格的鄰接資訊,如果不需要可以用指定該參數為NULL
pGlyphMetrics:指向LPGLYPHMETRICSFLOAT類型結構體的指標,該結構包含了字形(glyph)的度量資料(metric data),如果不需要該數值,可以將其設為NULL
可以看到函數的參數中有hdc這一選項,這個主要是為了將HFONT選入裝置上下文,然後利用該字型去繪製3D文字網格。,因此我們需要先建立字型,然後將字型選入裝置中。
建立字型毫無疑問就是利用上面說的CreateFont或者CreateFontIndirect函數。
樣本如下:
//建立字型HFONT hFont;HFONT hFontOld;HDC hdc = CreateCompatibleDC(NULL);hFont = CreateFont(25,12,0,0,500,false,false,false,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,TEXT("宋體") );hFontOld = (HFONT)SelectObject(hdc,hFont);D3DXCreateText(m_pDevice,hdc,TEXT("不經打擊老天真"),0.001f,0.5f,&m_pFontMesh,NULL,NULL);SelectObject(hdc,hFontOld);DeleteObject(hFont);DeleteDC(hdc);//繪製字型m_pFontMesh->DrawSubset(0);
最終顯示效果:
程式的: