[winapi] 설치되지 않은 폰트 설치하지 않고 사용하기 미분류

 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 계열에서는 이렇게 해도 폰트를 찾지 못한다. 이 부분은 다음에 다루는 것으로.




덧글

댓글 입력 영역