GDIを使用してフォントを作成する一般的な方法は、次のように目的のポイントサイズとターゲットデバイスの垂直解像度(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フォントマッパーとプリンタードライバーがどのように機能するのか疑問に思っています。