3

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を組み合わせますか?私はこのようなことを考えています: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フォントマッパーとプリンタードライバーがどのように機能するのか疑問に思っています。

4

1 に答える 1

0

1) 72 ポイント/インチがあります。(以前は 72.27 でしたが、変更されました。) 2) このように LOGPIXELSX と LOGPIXELSY を組み合わせても問題ありませんが、3) フォント マッパーは、フォントをマッピングするときにエスケープメントと向きを調べません。LOGPIXELS 値は、座標変換の一部としてのみ使用されます。

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

ステートメントには多くの可能なドライバーとプリンターが含まれている可能性があるため、「プリンタードライバーの動作」についてはわかりません。

正方形のピクセルでラスタライズしてから、非正方形に引き伸ばすことができます。それらはグリフ曲線を変換できます。彼らは何か他のことをすることができました。

于 2009-07-06T21:22:08.903 に答える