2009-05-30 3 views
3

GDI를 사용하여 글꼴을 만드는 일반적인 방법은 다음과 같이 원하는 포인트 크기와 대상 장치의 세로 해상도 (DPI)를 사용하는 것입니다.다른 방향에서 글꼴 높이를 어떻게 지정합니까?

LOGFONT lf = {0}; 
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72); 
... 
HFONT hfont = CreateFontIndirect(&lf); 

기본 MM_TEXT 매핑 모드를 가정하면이 방법으로 point_size가 픽셀 높이 원하는 장치 용. (이것은 일반적인 근사값이며 실제로는 72.27 인치가 아니라 72 인치입니다.) (마이너스 기호는 셀 높이가 아닌 실제 문자 높이를 지정한다는 의미입니다.)

옆쪽 글꼴 - 즉 방향 및 90도 이스케이프가있는 글꼴 - LOGPIXELSY 대신 LOGPIXELSX을 사용합니까? 내가 목표로 삼고있는 프린터 중 일부는 수평 해상도와 수직 해상도가 다릅니다.

일반적으로 theta의 각도를 원한다면 LOGPIXELSXLOGPIXELSY를 결합합니까? 나는 이런 식으로 생각하고있어 :

// Given theta in degrees (e.g., theta = 45.0) ... 
double theta_radians = theta * 2.0 * pi/360.0; 
int dpi = static_cast<int>(GetDeviceCaps(hdc, LOGPIXELSX) * sin(theta_radians) + 
          GetDeviceCaps(hdc, LOGPIXELSY) * cos(theta_radians) + 
          0.5); 
LOGFONT lf = {0}; 
lf.lfHeight = -MulDiv(point_size, dpi, 72); 
// Set escapement and orientation to theta in tenths of a degree. 
lf.lfEscapement = lf.lfOrientation = static_cast<LONG>(theta * 10.0 + 0.5); 
... 

이것은 직관적 인 의미가 있지만 실제로 GDI 글꼴 매퍼 및 프린터 드라이버가 작동하는지 궁금해.

+0

실제로이 코드를 그런 프린터에서 사용해 보셨습니까? 당신은 당신이 얻는 어떤 해결책을 시험하고 싶을 것이다, 맞죠? –

+0

결과는 프린터마다 다르므로 드라이버가 버그가있는 것으로 추정됩니다. 나는 그것이 어떻게 작동하도록되어 있는지 궁금합니다. –

답변

0

1) 72 점/인치가 있습니다. (이전에는 72.27 였지만 변경되었습니다.) 2) LOGPIXELSX와 LOGPIXELSY를 합치는 방식으로 결합했지만, 3) 글꼴 맵핑시 폰트 맵퍼가 에스 케이프먼트와 방향을 찾지 않습니다. LOGPIXELS 값은 좌표 변환의 일부로 만 사용됩니다.

http://msdn.microsoft.com/en-us/library/ms969909(loband).aspx

문이 많은 가능한 드라이버와 프린터를 포함 할 수 있기 때문에 "프린터 드라이버가 작동"방법에 대해 확실하지.

정사각형 픽셀로 래스터 화 한 다음 비 정사각형으로 늘일 수 있습니다. 글리프 커브를 변형 할 수 있습니다. 그들은 다른 것을 할 수 있습니다.

+0

글꼴 매퍼에 대한 기사 링크에 감사드립니다. 불행히도,이 질문에 대해서는 충분히 구체적이지 않습니다. 인치당 세로로 72 픽셀, 가로로 세로로 144 픽셀의 프린터를 사용한다고 가정 해 보겠습니다. 일반 글꼴에 대해 lfHeight를 10으로 지정하면 높이가 10 포인트 인 텍스트를 가져옵니다. 그러나 오리엔테이션과 탈주 각도를 90 도로 지정하면 문자가 5 포인트 높이인지 10 포인트인지 명확하지 않습니다. lfHeight를 적용 할 때 매퍼 및/또는 래스터 라이저가 회전을 고려하는지 여부에 따라 달라집니다. –

관련 문제