次の方法で共有


フォント メトリックの取得

FontFamily クラスには、特定のファミリ/スタイルの組み合わせのさまざまなメトリックを取得する次のメソッドが用意されています。

これらのメソッドによって返される数値はフォント デザイン単位であるため、特定の Font オブジェクトのサイズと単位に依存しません。

次の図は、上昇、降下、行間を示しています。

セルの上昇、セルの降下、行間を示す、隣接する行の 2 文字の図

次の例では、Arial フォント ファミリの標準スタイルのメトリックを表示しています。 このコードでは、サイズが 16 ピクセルの Font オブジェクト (Arial ファミリに基づく) も作成され、その特定の Font オブジェクトのメトリック (ピクセル単位) が表示されます。

#define INFO_STRING_SIZE 100  // one line of output including null terminator
WCHAR infoString[INFO_STRING_SIZE] = L"";
UINT  ascent;                 // font family ascent in design units
REAL  ascentPixel;            // ascent converted to pixels
UINT  descent;                // font family descent in design units
REAL  descentPixel;           // descent converted to pixels
UINT  lineSpacing;            // font family line spacing in design units
REAL  lineSpacingPixel;       // line spacing converted to pixels
                       
FontFamily   fontFamily(L"Arial");
Font         font(&fontFamily, 16, FontStyleRegular, UnitPixel);
PointF       pointF(10.0f, 10.0f);
SolidBrush   solidBrush(Color(255, 0, 0, 0));

// Display the font size in pixels.
StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE, 
   L"font.GetSize() returns %f.", font.GetSize());

graphics.DrawString(
   infoString, -1, &font, pointF, &solidBrush);

// Move down one line.
pointF.Y += font.GetHeight(0.0);

// Display the font family em height in design units.
StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE, 
   L"fontFamily.GetEmHeight() returns %d.", 
   fontFamily.GetEmHeight(FontStyleRegular));

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);

// Move down two lines.
pointF.Y += 2.0f * font.GetHeight(0.0f);

// Display the ascent in design units and pixels.
ascent = fontFamily.GetCellAscent(FontStyleRegular);

// 14.484375 = 16.0 * 1854 / 2048
ascentPixel = 
   font.GetSize() * ascent / fontFamily.GetEmHeight(FontStyleRegular);

StringCchPrintf(
   infoString,
   INFO_STRING_SIZE,
   L"The ascent is %d design units, %f pixels.",
   ascent, 
   ascentPixel);

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);

// Move down one line.
pointF.Y += font.GetHeight(0.0f);

// Display the descent in design units and pixels.
descent = fontFamily.GetCellDescent(FontStyleRegular);

// 3.390625 = 16.0 * 434 / 2048
descentPixel = 
   font.GetSize() * descent / fontFamily.GetEmHeight(FontStyleRegular);

StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE,
   L"The descent is %d design units, %f pixels.",
   descent, 
   descentPixel);

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);

// Move down one line.
pointF.Y += font.GetHeight(0.0f);

// Display the line spacing in design units and pixels.
lineSpacing = fontFamily.GetLineSpacing(FontStyleRegular);

// 18.398438 = 16.0 * 2355 / 2048
lineSpacingPixel = 
   font.GetSize() * lineSpacing / fontFamily.GetEmHeight(FontStyleRegular);

StringCchPrintf(
   infoString, 
   INFO_STRING_SIZE,
   L"The line spacing is %d design units, %f pixels.",
   lineSpacing, 
   lineSpacingPixel);

graphics.DrawString(infoString, -1, &font, pointF, &solidBrush);
            

次の図は、前のコードの出力を示しています。

フォントサイズと高さ、および上昇、降下、行間を示すテキストを含むウィンドウのスクリーンショット

上記の図の出力の、最初の 2 行に注意してください。 Font オブジェクトは 16 のサイズを返し、FontFamily オブジェクトは 2,048 の em の高さを返します。 これら 2 つの数値 (16 と 2,048) は、フォント デザイン単位と Font オブジェクトの単位 (この場合はピクセル) の間の変換の鍵となります。

たとえば、次のようにして、アセントをデザイン単位からピクセルへと変換することもできます。

1854 デザイン単位に 16 ピクセルを 2048 デザイン単位で除算し、14.484375 ピクセルに乗算する式

上記のコードでは、PointF オブジェクトの y データ メンバーを設定することで、テキストを垂直方向に配置します。 y 座標は、テキストの新規行ごとに font.GetHeight(0.0f) ずつ増加します。 Font オブジェクトの Font::GetHeight メソッドは、その特定の Font オブジェクトの行間 (ピクセル単位) を返します。 この例では、 Font::GetHeight によって返される数値は 18.398438 です。 これは、行間メトリックをピクセルに変換した数値と同じであることに注意してください。