INFO: Calculating Text Extents of Bold and Italic Text

This article was previously published under Q74298
This article has been archived. It is offered "as is" and will no longer be updated.
GetTextExtent() can be used to calculate the extent of a string. The value returned may need to be adjusted, depending upon the style of the font. When an italic or bold font is requested and none are available, theGraphics Device Interface (GDI) may simulate those styles using an existingraster or vector font.
GDI-simulated bold and italic fonts both include overhangs. Theoverhang is specified in a TEXTMETRIC structure obtained by callingthe GetTextMetrics function. The proper method for calculating theextent of a line of italic or bold text is shown below:
   dwExtent = GetTextExtent(hDC, lpString, nCount);   GetTextMetrics(hDC, &tm);   xExtent = LOWORD(dwExtent) - tm.tmOverhang;				
Listed below are examples of italic text alignment. If the nextcharacter is not italic, the overhang should not be subtractedfrom the advance width returned from the GetTextExtent function. Theoverhang needs to be subtracted only when the next for text alignment character has thesame style.
                                        GetTextExtent yields                                        this as the extent:                                              ||       /   /                                  \/       /   /           /   / /   /         /   /|   |     /---/           /   / /   /         /   / |   |    /   /           /---/ /---/         /---/  |---|   /   /           /   / /   /         /   /   |   |       -----      /   / /   /         /   /    |   |         ^            /\                      /\       Overhang        ||                      ||               Because the next        Start the nonitalic H               character is italic,    here because it does not               start the next          slant and would partially               character within the    overwrite the previous               overhang of the         italic character.               current character				
The overhang for bold characters synthesized by GDI is generally 1because GDI synthesizes bold fonts by outputting the text twice,offsetting the second output by one pixel, effectively increasing thewidth of each character by one pixel. Calculating the advance width of thebold text is similar to the method for italic text. TheGetTextExtent function always returns the extent of the text plus 1for bold text. Thus by subtracting the tmOverhang(1), the properadvance is achieved.
        ||   ||        ||   ||        ||===||        ||   ||        ||   ||              ---<= This line represents the "extra" overhang of 1.                /\                 ||             GetTextExtent yields             this as the extent of the             bold H.				
NOTE: This article applies only to Raster and Vectory Fonts. The GetTextExtent() family of functions always return advance widths of strings for TrueType fonts as described by ABC widths structure. For more information on ABC advance widths, see the GetCharABCWidths() function documentation.
3.00 3.10 3.50 4.00 win16sdk test advance width

Article ID: 74298 - Last Review: 02/27/2014 21:02:07 - Revision: 3.2

  • Microsoft Windows Software Development Kit 3.1
  • Microsoft Win32 Application Programming Interface
  • kbnosurvey kbarchive kbinfo KB74298