DirectX中的字型應用

來源:互聯網
上載者:User

標籤: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);

最終顯示效果:


程式的:


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.