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으로 했다면, 텍스트를 볼 수 없다.
);
'예전 > 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 |