取得字型參數
FontFamily 類別提供下列方法來擷取特定系列/樣式組合的各種計量:
- FontFamily::GetEmHeight(FontStyle)
- FontFamily::GetCellAscent(FontStyle)
- FontFamily::GetCellDescent(FontStyle)
- FontFamily::GetLineSpacing(FontStyle)
這些方法傳回的數位是以字型設計單位表示,因此它們與特定 Font 物件的大小和單位無關。
下圖顯示上升、下降和行距。
顯示行內相鄰字元上升、下降和行距的示意圖
下列範例會顯示 Arial 字型系列一般樣式的計量。 程序代碼還會建立一個以 Arial 字體系列為基礎,大小為 16 像素的 Font 物件,並顯示該特定 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);
下圖顯示上述程式代碼的輸出。
請注意上圖中的前兩行輸出。 Font 物件會傳回大小 16,而 FontFamily 物件會傳回 2,048 的 em 高度。 這兩個數位 (16 和 2,048) 是字型設計單位與 Font 物件的單位(在此案例中為像素)之間轉換的關鍵。
例如,您可以將上升從設計單位轉換成像素,如下所示:
上述程式代碼會設定 PointF 物件的 y 數據成員,將文字垂直放置。 每個新文字行的 Y 座標都會增加 font.GetHeight(0.0f)
。
Font 物件的 Font::GetHeight 方法會傳回該特定 Font 物件的行距(以像素為單位)。 在此範例中,Font::GetHeight 傳回的數位是 18.398438。 請注意,這與將行距度量轉換成圖元所取得的數位相同。