hyrule 2022. 6. 13. 19:22

http://hyrule.tistory.com/111 

 

*** 공부 방법 ***

1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처

hyrule.tistory.com

 


- 지난번에 만든 CFont, CFontManager 관련해서, 글꼴이 바뀌지 않는 문제가 있어 수정이 필요하다.

- 폰트가 위에서 아래로 바뀌어서 잘 적용되고 있는 줄 알았는데,

알고 보니 원하는 폰트로 바뀐 것이 아니라 폰트가 제대로 로드되지 않아 윈도우 기본 출력인 굴림체로 바뀐 것이었다.

- 다른 폰트를 로드해 봤는데 똑같은 폰트만 출력되어서 알아챘음.

 

 

 

[ 문제점 ]

- 폰트 파일은, AddFontResource() 함수를 통해서 윈도우가 켜져 있는 동안 임시로 로드할 수 있다.

- 그런데 로드된 폰트 리소스 파일을 불러올 때, 사람이 직접 폰트 이름을 지정해주는 것이 아니라, 

폰트 파일을 열면 나오는 '글꼴 이름'에 있는 명칭을 사용하여 로드해주어야 한다.

 

- 그런데, 코드에서는 이 글꼴 이름이 아닌, 로드할 때 썼던 파일명을 통해 폰트 불러오기를 시도했었고, 이때문에 정상적으로 폰트 로드가 이루어지지 않았던 것이다.

 

- 또한, 임시로 로드한 이 폰트는 종료할 떄 RemoveFontResource() 함수에서 다시 제거해주어야 한다.

-- 그러므로, 폰트를 로드할 때 썼던 풀 경로를 변수에 저장해 두었다가 소멸자에서 제거해 주는 작업을 추가로 해 주어야 한다.


class CFontManager

{ std::vector<std::tstring> m_LoadedFontFullpath }

- 로드된 폰트의 풀 경로를 저장해놓는다.

소멸자에서 RemoveFontResource() 함수에 인자로 전달할 내용들이다.

 

 

- 2개의 메소드로 오버로드되어있던 LoadFont()를, 이름을 두 개로 나누어준다.

 

< bool LoadFontResource(const std::tstring& FontFileName, const std::string& PathName = FONT_PATH) >

- 여기서 AddFontResource() 함수를 호출하여 폰트 파일을 로드하는 기능을 담당한다.

- AddFontResource() 함수가 제대로 로딩에 성공했을 경우, m_LoadedFontFullpath에 경로를 추가해 준다.

 

 

< bool LoadFontInfo(const std::string& Name, const std::tstring& FontName, int Width, int Height) >

1. 코드 안에서 쓸 '이름'

2. 폰트 파일을 열면 나오는 '폰트 이름'

3, 4. 출력 사이즈

- 이 메소드에서 받은 인자를, CFont의 LoadFont() 메소드에 전달한다.

 

 

< ~CFontResource() >
- m_LoadedFontFullpath를 순회 돌면서 RemoveFontResource()를 실행해 준다.


class CFont

< LoadFontInfo() >

- LoadFont() -> LoadFontInfo()로 바꿔줌

{ LOGFONT m_FontInfo } 변수에 설정값들을 저장한다.

m_FontInfo.lfFaceName은,  폰트 이름(FontName) 을 활용하여 만들어주어야 정상적으로 로딩된다.


class CResourceManager;
class CSceneResource;

- 이 클래스의 폰트 관련 메소드도 바뀐 형식에 맞게 바꾸어준다.


- 이젠 이렇게 폰트 리소스 로드를 해 준 뒤에, 폰트를 프로그램 안에서 불러올 때는 '폰트 이름'도 전달해 주어야 한다.

 

 

 

- 폰트가 잘 로딩되는지 현재 출력중인 텍스트의 폰트를 바꾸어 보았다.

 

폰트 변경 성공
GameFrameworkStepbyStep_70_FontFix.zip
10.36MB