どのように私は別の方向でのフォントの高さを指定するのですか?
-
06-09-2019 - |
質問
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度の向きとエスケープメント付き1 - 私は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)フォントマッパーは、脱進機と方向を見ていません。 LOGPIXELS値は、座標変換の一部として使用されます。
http://msdn.microsoft.com/en-私たち/ライブラリ/ ms969909(loband).aspxのの
声明は、多くの可能なドライバやプリンタを含めることができますので、「プリンタドライバが動作する」方法について。このわかりません
これらは非正方形に伸び、その後、正方形ピクセルにラスタライズすることができました。彼らは、グリフの曲線を変換することができます。彼らは何かを行うことができます。