본문 바로가기

예전/3D

[3D] Font 관련



D3D 에선 텍스트를 만들고, 출력하는 세 가지 방법이 있다.


1. ID3DXFont


이 인터페이스는 텍스트를 그리는데 이용되며, 내부적으로 GDI를 이용하기 때문에

약간의 성능 저하가 있지만, 복잡한 글꼴이나 포멧팅을 이용할 수 있다.


D3DXCreateFont() 함수를 사용해  ID3DXFont로의 포인터를 얻는다.



HRESULT D3DXCreateFont(

  _In_   LPDIRECT3DDEVICE9 pDevice,

  _In_   INT Height,

  _In_   UINT Width,

  _In_   UINT Weight, // FW_THIN,NORMAL,BOLD,HEAVY

  _In_   UINT MipLevels, // 만들어야하는 밉맵의 수. 0은 full chain.

// 다른 크기의 폰트를 좀 더 효과적으로 보여주기 위해

  _In_   BOOL Italic,

  _In_   DWORD CharSet, // 문자 집합. DEFAULT_CHARSET

  _In_   DWORD OutputPrecision, // 출력이 폰트와 얼마나 매치되었는가? OUT_DEFAULT_PRECIS

  _In_   DWORD Quality, // ANTIALIASED_QUALITY, DEFAULT_QUALITY, DRAFT_QUALITY, and PROOF_QUALITY.

  _In_   DWORD PitchAndFamily, // DEFAULT_PITCH|FF_DONTCARE.

  _In_   LPCTSTR pFacename, // 글꼴

  _Out_  LPD3DXFONT *ppFont

);



LPCTSTR pFacename에 MS가 지원하는 폰트를 쓸 수 있다.

만약 폰트를 찾을 수 없다면, Courier New라는 폰트로 대체하고, Weight는 FW_BOLD로 한다.


만약 사용이 끝나면 Release 해줘야한다.



새로운 폰트 적용시 c://windows/fonts/ 내에 폰트가 있으면 제대로 불러지지만,

아닐 경우 잘 불려지지 않는다.


폰트를 설치하지않고, TTF file로 사용하려면 AddFontResourceEx 함수를 사용하면 된다.

이 함수는 폰트 리소스를 파일로 부터 시스템에 더한다. 폰트는 이 함수를 통해 

private되어지고 나열되지 않는다.


AddFontResourceEx()/RemoveFontResourceEx() 함수는 폰트를 프로그램 내부에서 사용하고 해제 할때 사용하는 함수이다.



===========================(사용법)==============================


// 폰트 등록

hr = AddFontResourceEx("font/08SeoulNamsanB.ttf", FR_NOT_ENUM, NULL);

hr = AddFontResourceEx("font/08SeoulHangangM.ttf", FR_NOT_ENUM, NULL);

// ID3DXFont 객체 생성

hr = D3DXCreateFont(…, "08서울남산체 B", &m_pDXFont1);

// 폰트 해제

RemoveFontResourceEx("font/08SeoulNamsanB.ttf", FR_NOT_ENUM, NULL);

RemoveFontResourceEx("font/08SeoulHangangM.ttf", FR_NOT_ENUM, NULL);


=================================================================



AddFontResource는 SendMessage WM_FONTCHANGE 를 해야한다.


===========================(사용법)==============================


nResult = AddFontResource(szFontFile);

SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0); 

return nResult;


=================================================================



그러나 AddFontResourceEx는 안그래도 되는데 왜그럴까?


왜냐하면 Ex는 아무도 볼 수 없는 private으로 더해지기 때문이다. 따라서 

SendMessage를 보내 알릴 필요가 없다.

하지만 만약 FR_PROVATE or FR_NOT_ENUM 가 아니면, SendMessage를 해야한다.



ID3DXFont::DrawText 함수로 텍스트를 그릴 수 있다.


// 문자열 포인터, 문자열 길이, 텍스트가 화면 상에 그려질 영역, 텍스트 포멧 플래그, 텍스트 컬러

DrawText(pString,Cnt,RECT,Format,Color);


INT DrawText(

   LPD3DXSPRITE pSprite, // ID3DXSprite, 나중에 쓴다 지금은 NULL

   LPCTSTR pString, // 그릴 문자열

   int Count,

   LPRECT pRect, // 화면 상에 그릴 영역

   DWORD Format, // Text 포멧

   D3DCOLOR Color // 색상. 알파채널은 투명표현시 사용되며,

// 만약 0으로 했다면, 텍스트를 볼 수 없다.

);



2. CD3Dfont

1보다 빠르지만 복잡한 건 나타낼 수 없다.

3. D3DXCreateText

3D 메쉬를 만드는데 이용된다.


'예전 > 3D' 카테고리의 다른 글

[3D UI] ShellExecute  (0) 2012.10.22
[3D] 문자 집합  (0) 2012.10.12
[3D] Texture 함수  (0) 2012.10.11
[3D] 밉맵  (0) 2012.10.11
[3D] GetTransform과 GetViewport  (0) 2012.09.27