다른 방향에서 글꼴 높이를 어떻게 지정합니까?
-
06-09-2019 - |
문제
GDI를 사용하여 글꼴을 생성하는 일반적인 방법은 원하는 포인트 크기와 대상 장치의 DPI (Dection)의 수직 해상도 (DPI)를 사용하는 것입니다.
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(point_size, GetDeviceCaps(hdc, LOGPIXELSY), 72);
...
HFONT hfont = CreateFontIndirect(&lf);
기본값을 가정합니다 MM_TEXT
매핑 모드에서는 원하는 장치의 Point_Size를 픽셀 높이로 변환합니다. (이것은 일반적인 근사치입니다. 실제로 72가 아닌 1 인치에 72.27 포인트가 있습니다.) (마이너스 부호는 셀 높이가 아닌 실제 문자 높이를 지정하고 싶다는 것을 의미합니다.)
옆으로 글꼴을 만들고 싶다면 90 도의 방향과 탈출이있는 글꼴입니다. LOGPIXELSX
보다는 LOGPIXELSY
? 내가 타겟팅하는 일부 프린터의 경우 수평 및 수직 해상도가 다릅니다.
일반적으로 각도를 원한다면 theta
, 내가 결합합니까? LOGPIXELSX
그리고 LOGPIXELSY
? 나는 다음과 같은 것을 생각하고있다 :
// 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 글꼴 맵퍼와 프린터 드라이버의 작동 방식인지 궁금합니다.
올바른 솔루션이 없습니다
다른 팁
1) 72 포인트/인치가 있습니다. (예전에는 72.27 이었지만 변경되었습니다.) 2) logpixelsx와 logpixelsy를 결합하는 것은 괜찮지 만 3) 글꼴 맵퍼는 글꼴을 매핑 할 때 탈출과 방향을 보지 않습니다. 로그 픽셀 값은 좌표 변환의 일부로 만 사용됩니다.
http://msdn.microsoft.com/en-us/library/ms969909(loband).aspx
진술에는 가능한 많은 드라이버와 프린터가 포함될 수 있기 때문에 "프린터 드라이버 작동"에 대해 잘 모르겠습니다.
그들은 사각형 픽셀로 래스터 화 한 다음 비 제곱으로 늘릴 수 있습니다. 그들은 글리프 곡선을 변형시킬 수 있습니다. 그들은 다른 일을 할 수 있습니다.