CreateFont는 기본적으로 시스템에 설치된 폰트를 찾는다. 하지만 사용자가 무슨 폰트를 설치했는지도 모르고, 그렇다고 함부로 사용자 컴퓨터에 '이 폰트 설치해주세요 ㅎㅎ' 할 수는 없다. 당장 대부분의 프로그램에서 사용자가 설치하지 않은 폰트로 프로그램에 글자를 적는다. 어떻게?
당연히 MS에서는 이에 대한 방법을 모두 구현해 두셨고, 이 포스트를 찾는 사람이라면 그 방법을 못 찾았거나 너무 어려워서 간단한 샘플을 원하리라 생각한다.
일단 windows GDI부터 확인해보자.
GDI에서는 관련된 함수가 단 두 개다.
AddFontMemResourceEx
RemoveFontMemResourceEx
이름도 정말 정직하다. 메모리 영역에 폰트를 추가한다는 뜻이고, 프로그램이 종료되면 폰트는 사용할 수 없게 된다. 해제 역시 하면 좋지만 하지 않더라도 프로그램이 종료하며 동시에 해제된다.
사용 방법은 간단한 편이다. AddFontMemResourceEx의 인자는 4개인데, 다음과 같다.
HANDLE AddFontMemResourceEx(
PVOID pFileView,
DWORD cjSize,
PVOID pvResrved,
DWORD *pNumFonts
);
출처:<https://docs.microsoft.com/ko-kr/windows/desktop/api/wingdi/nf-wingdi-addfontmemresourceex>
자세한 인자 설명은 출처를 참고하면 된다. 간단한 설명방법만 알려주자면, 준비물은 단 하나이다. 폰트파일.
폰트파일의 데이터를 통째로 읽어 들이고, 그 크기를 알아야한다. 그것이 pFileView와 cjSize이다. pvResrved는 시스템 예약으로 무조건 0(NULL)값을 줘야 하고, pNumFonts는 현재 이 폰트가 설치된 개수를 반환하는 포인터 값이다.
// v : 폰트 데이터를 담은 std::verctor
auto date = reinterpret_cast<char*>(v.data());
auto size = static_cast<DWORD>(v.size());
HANDLE out = AddFontMemResourceEx(data, size, 0, &nInstalled);
이렇게 폰트를 설치하면 그 후는 자유롭게 사용이 가능하다.
문제는 DirectX 계열에서는 이렇게 해도 폰트를 찾지 못한다. 이 부분은 다음에 다루는 것으로.
덧글