Condividi tramite


Recupero delle metriche dei tipi di carattere

La classe FontFamily fornisce i metodi seguenti che recuperano varie metriche per una particolare combinazione di famiglia/stile:

I numeri restituiti da questi metodi sono in unità di progettazione dei tipi di carattere, quindi sono indipendenti dalle dimensioni e dalle unità di un particolare oggetto Font .

La figura seguente mostra l'ascente, la discesa e la spaziatura linea.

diagramma di due caratteri su linee adiacenti, che mostra l'ascente della cella, la discesa delle celle e la spaziatura linea

Nell'esempio seguente vengono visualizzate le metriche per lo stile regolare della famiglia di caratteri Arial. Il codice crea anche un oggetto Font (basato sulla famiglia Arial) con dimensioni di 16 pixel e visualizza le metriche (in pixel) per quel particolare oggetto 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);
            

La figura seguente mostra l'output del codice precedente.

screenshot di una finestra con testo che indica le dimensioni e l'altezza del carattere e l'ascente, discesa e spaziatura linea

Si notino le prime due righe di output nell'illustrazione precedente. L'oggetto Font restituisce una dimensione pari a 16 e l'oggetto FontFamily restituisce un'altezza em pari a 2.048. Questi due numeri (16 e 2.048) sono la chiave per la conversione tra le unità di progettazione del carattere e le unità (in questo caso pixel) dell'oggetto Font .

Ad esempio, è possibile convertire l'ascente da unità di progettazione a pixel come indicato di seguito:

equazione che moltiplica 1854 unità di progettazione per 16 pixel diviso per 2048 unità di progettazione, pari a 14,484375 pixel

Il codice precedente posiziona il testo verticalmente impostando il membro dati y di un oggetto PointF . La coordinata y viene aumentata di font.GetHeight(0.0f) per ogni nuova riga di testo. Il metodo Font::GetHeight di un oggetto Font restituisce l'interlinea , espressa in pixel, per quel particolare oggetto Font . In questo esempio il numero restituito da Font::GetHeight è 18.398438. Si noti che si tratta dello stesso numero ottenuto convertendo la metrica di interlinea in pixel.