본문 바로가기
Digital Image Processing

GDI+ DrawString, Font 오류 문제

by leo21c 2014. 8. 14.


HYGTRE.TTF

여러가지로 테스트를 진행했지만 GDI+ DrawString을 이용해서 특정 폰트를 가지고 출력할 때 오류가 발생한다.

원인은 아직까지 확인하지 못했다. 내가 가지고 있는 폰트중에 "HY견고딕" 이라는 폰트가 있다.

폰트 정보는 아래와 같다.

 파일 형식: 트루타입 글꼴 파일(.TTF)
 저작권: HanYang I&C Co., Ltd
 OpenType: 레이아웃, TrueType 윤곽선
 한글폰트
 버전: 3.10

폰트를 확인하면 당연히 ?도 포함되어 있다. 그러나 GDI+로 화면에 출력을 하면 ?가 표시되지 않는다.

어떤 폰트를 가지고 출력을 할 때에는 모든 글자가 출력되지 않는 것도 있었다.


당연히 GDI방식과 Direct2D 방식인 DirectWrite API로 처리를 하면 정상적으로 화면에 출력이 된다.

원인이 밝혀지면 이 페이지를 업데이트 하겠지만 현재로서는 GDI+ 방식에 오류로 결정을 했다.

이 문제로 새로 진행하는 개발은 Direct2D를 이용해야 할 것 같다.


첨부파일로 올리는 폰트는 상용인지 모르겠다. 우선 내글을 보고 테스트를 진행하는 사람이 이용할 수 있도록 올려본다.

아래 소스는 MFC로 만든 테스트 소스이다.

void CGdiplusImageView::OnPaint()
{
  CPaintDC dc(this); // device context for painting
  CFont font;
  VERIFY(font.CreateFontIndirect(&m_lgFont));

  CString strTmp = _T("GDI Test 폰트 출력 테스트 ???? 확인");
  CFont* def_font = dc.SelectObject(&font);
  dc.TextOut(10, 10, strTmp,strTmp.GetLength());
  dc.SelectObject(def_font);

  font.DeleteObject();

  Graphics graphics(dc);
  graphics.SetSmoothingMode(SmoothingModeHighQuality);

  strTmp = _T("GDI+ Test 폰트 출력 테스트 ???? 확인");

  Gdiplus::FontFamily   fontFamily(m_lgFont.lfFaceName);
  Gdiplus::Font         myfont(&fontFamily, m_fontSize, Gdiplus::FontStyleRegular,Gdiplus::UnitPoint);
  Gdiplus::RectF        layoutRect(10.0f, 50.0f, 500.0f, 300.f);
  Gdiplus::SolidBrush   blackBrush(Gdiplus::Color(255,0,0,0));

  graphics.DrawString(strTmp, strTmp.GetLength(), &myfont, layoutRect, NULL, &blackBrush);
}

void CGdiplusImageView::OnFontSet()
{
  CFontDialog dlg;
  dlg.DoModal();

  LOGFONT lf;
  dlg.GetCurrentFont(&lf);
  memcpy(&m_lgFont, &lf, sizeof(LOGFONT));  

  m_fontSize = dlg.GetSize();
  m_fontSize /= 10;

  this->Invalidate();
}