.폰트 선택

ApiDraw 글꼴의 종류를 입력받는 방법은 아주 단순해서 글꼴을 오로지 이름만으로 선택하도록 되어 있다. 그러나 윈도우즈의 폰트 매퍼는 글꼴의 이름보다 문자셋과 피치, 패밀리를 우선적으로 고려하기 때문에 아무리 글꼴의 이름이 맞더라도 원하는 글꼴이 선택되지 않는 경우가 많다. 지금 OnPaint 작성된 글꼴 선택 코드는 문자셋을 HANGUL_CHARSET으로, 피치는 가변으로, 패밀리는 ROMAN으로 가정하고 있는데 이는 아주 위험한 가정이다.

상태에서 Wingding이나 Webding 등의 장식체를 선택하면 글꼴이 제대로 출력되지 않는데 글꼴 생성문의 문자셋이 틀렸기 때문이다. 글꼴을 정확하게 선택하기 위해서는 무엇보다도 문자셋이 우선적으로 맞아야 한다. 그렇다고 해서 속성 대화상자에 문자셋, 피치, 패밀리를 선택하도록 사용자에게 부담시킬 수도 없는 노릇이므로 지정한 글꼴의 정확한 속성을 찾는 작업은 프로그램이 직접 해야 한다. 이미 글꼴 열거를 상태이므로 정보를 조사하는 것은 어렵지 않다. 먼저 다음 함수를 추가한다.

 

int FindFontFromFace(TCHAR *Face)

{

   int i;

 

   if (FontNum == 0) {

      ReEnum();

   }

   for (i=0;i<FontNum;i++) {

      if (lstrcmp(logfont[i].lfFaceName,Face)==0) {

          return i;

      }

   }

   return -1;

}

 

함수는 인수로 전달된 글꼴 이름이 열거된 목록의 번째에 있는지를 조사하며 발견되지 않을 경우 -1 리턴한다. 열거된 결과로부터 폰트의 특성을 조사해야 하므로 함수가 제대로 동작하려면 먼저 열거를 놓은 상태여야 한다. 만약 그렇지 않다면 함수가 직접 열거를 지시한다. 그래서 최초 열거를 하는 시점은 속성 대화상자를 열거나 텍스트를 삽입할 때가 된다. OnPaint 함수를 호출하여 사용자가 지정한 글꼴의 정확한 특성을 조사할 있다.

 

LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   ....

   int FontIdx;

   LOGFONT tFont;

 

      case DT_TEXT:

          FillRect(hMemDC,&arObj[idx]->rt,hBrush);

          FontHeight=arObj[idx]->FontSize*GetDeviceCaps(hMemDC,LOGPIXELSY)/72;

          FontIdx=FindFontFromFace(arObj[idx]->FontFace);

          if (FontIdx!=-1) {

             tFont=logfont[FontIdx];

             tFont.lfHeight=FontHeight;

             tFont.lfWidth=0;

             hFont=CreateFontIndirect(&tFont);

             hOldFont=(HFONT)SelectObject(hMemDC,hFont);

          }

          if (arObj[idx]->FontColor != (COLORREF)-1) {

             SetTextColor(hMemDC,arObj[idx]->FontColor);

             DrawText(hMemDC,arObj[idx]->Text,-1,&arObj[idx]->rt,DT_WORDBREAK);

          }

          if (FontIdx!=-1) {

             DeleteObject(SelectObject(hMemDC,hOldFont));

          }

          break;

 

타입페이스로부터 글꼴의 번호를 찾고 번호로부터 logfont배열에서 글꼴 특성을 복사한 크기만 사용자가 지정한 크기로 변경한다. 그리고 조사된 특성대로 글꼴을 생성해서 사용했다. 만약 지정한 글꼴이 없다면, 예를 들어 다른 컴퓨터에서 편집된 파일을 복사해온 경우라면 시스템 글꼴로 대신 출력하도록 했다. 존재하지 않는 글꼴에 대해서는 대체 글꼴을 찾아 출력하는 수밖에 없다.

코드에 의해 문제가 일단 해결되기는 했지만 OnPaint에서 열거된 글꼴 목록을 뒤진다는 것은 속도상 상당한 부담이 되는데 빠른 속도를 얻고 싶다면 DObject 구조체에 문자셋, 피치 등의 정보를 같이 저장해야 한다. 아니면 아예 LOGFONT 구조체를 통채로 저장하는 방법도 있다.