データをプリンターに出力するアプリケーションがあります。今のところ、フォント サイズを 18 ポイントにハードコーディングし、印刷に関連するすべての座標とオフセットを計算して (特定の 18 ポイント フォントの場合)、印刷しています。これは、アプリケーションを開発するための基礎として行いました。
今、フォントサイズとフェイスに応じて、すべてを動的に調整できるようにしたいと考えています。
フォントの論理サイズを取得するために、エラー チェックを行わずに次のテスト コードを作成しました (C)。
void GetTextSize(char *input, size_t inputSize, char *fontName, size_t fontSize, SIZE *size)
{
if(input == NULL || size == NULL || fontName == NULL)
{
return;
}
else
{
HFONT hFont = NULL;
LOGFONT lf;
HDC hdc = NULL;
memset(&lf, 0, sizeof(lf));
// Get the device context of the entire screen
hdc = GetDC(NULL);
// Set the face-name
strcpy(lf.lfFaceName, fontName);
// Set the font height
lf.lfHeight = -MulDiv(fontSize, GetDeviceCaps(hdc, LOGPIXELSY), 72);
// Set the font weight
lf.lfWeight = FW_NORMAL;
// Create the font
hFont = CreateFontIndirect(&lf);
// Re-associate the obtained device context with the font just created
SelectObject(hdc, hFont);
// Get the required dimensions for the text
GetTextExtentPoint32(hdc, input, inputSize, &size);
// Free resources
ReleaseDC(NULL, hdc);
DeleteObject(hFont);
hFont = NULL;
hdc = NULL;
}
}
基本的、
- 画面全体のデバイス コンテキストを取得します。
CreateFontIndirect
とLOGFONT
構造体を使用して目的のフォントを作成します。- デバイス コンテキストを作成したフォントに再度関連付けます。
- を使用して論理単位でフォント幅を計算し
GetTextExtentPoint32
ます。
上記のコードにより、size
変数に , が含まれcx = 241
ますcy = 34
。(私のモニターの DPI は 96 です)
これらの値を実際の印刷サイズにマッピングするにはどうすればよいですか? デフォルトのテキスト マッピング モードはであるMM_TEXT
ため、これらのcx
とのcy
値はピクセルに対応します。
これを行う必要がある理由は 2 つあります。
- 長い行を複数の行に分割する必要があります。ページの幅がインチでわかっているので、必要なのはテキストの幅 (インチ) だけです。
- フォント サイズに基づいて印刷を開始する場所を決定する必要があります。
プリンターの仕様によると、1 mm あたりのドット数は 8 です。つまり、DPI は約 203.2 です。