[Programming Visual C++]Chapter Five Fonts

With the TrueType fonts, it doesn't much matter what mapping mode you use; simply choose a font height and go for it. No need to worry about points.

If you're using the CDC::GetTextExtent function to calculate line breaks, the screen breakpoint will occasionally be different from the printer breakpoint.


Index Description Value
HORZSIZE Physical width in millimeters 320
VERTSIZE Physical height in millimeters 240
HORZRES Width in pixels 640
VERTRES Height in raster lines 480
LOGPIXELSX Horizontal dots per logical inch 96
LOGPIXELSY Vertical dots per logical inch 96
1 inch = 25.4 mm
Using the values above and the fact that there are 25.4 millimeters per inch

physical display size:
320mm/ (25.4mm/inch) = 12.60 inch
240mm/(25.4mm/inch) = 9.45 inch
The physical display size is 12.60-by-9.45 inches,

logical size:
640pix/(96pix/inch) = 6.67inch
480pix/(96pix/inch) = 5.00inch
The logical size is 6.67-by-5.00 inches.

So the physical size and the logical size need not be the same.


For Windows NT 4.0, it turns out that HORZSIZE and VERTSIZE are independent of the display resolution, and LOGPIXELSX and LOGPIXELSY are always 96. So the logical size changes for different display resolutions, but the physical size does not. For Windows 95, the logical size and the physical size are equal, so both change with the display resolution. (At a resolution of 640-by-480 pixels with Windows 95, HORZSIZE is 169 and VERTSIZE is 127.)

So, for Windows NT, text is smaller on a small monitor; but that's not what you want. Instead, you want your font sizes to correspond to the logical display size, not the physical size.

You can invent a special mapping mode, called logical twips, for which one logical unit is equal to 1/1440 logical inch. This mapping mode is independent of the operating system and display resolution and is used by programs such as Microsoft Word. Here is the code that sets the mapping mode to logical twips:


pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(1440, 1440);
pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),
                    -pDC->GetDeviceCaps(LOGPIXELSY));


From the Windows Control Panel, you can adjust both the display font size and the display resolution. If you change the display font size from the default 100 percent to 200 percent, HORZSIZE becomes 160, VERTSIZE becomes 120, and the dots-per-inch value becomes 192. In that case, the logical size is divided by 2, and all text drawn with the logical twips mapping mode is doubled in size.

上面这段看不懂,为什么Horzsize是160?

You would think that tmHeight would represent the font size in points. Wrong! Another GetTextMetrics parameter, tmInternalLeading, comes into play. The point size corresponds to the difference between tmHeight and tmInternalLeading. With the MM_TWIPS mapping mode in effect, a selected 12-point font might have a tmHeight value of 295 logical units and a tmInter-nalLeading value of 55. The font's net height of 240 corresponds to the point size of 12.

Font size =  tmHeight - tmInter-nalLeading = net height
example: 12-point font <=> 240 = 295 - 55


If you want your font to be a specific point size, the CreateFont font height parameter (the first parameter) must be negative. If you're using the MM_TWIPS mapping mode for a printer, for example, a height parameter of -240 ensures a true 12-point font, with tmHeight - tmInternalLeading = 240. A +240 height parameter gives you a smaller font, with tmHeight = 240.


原文地址:https://www.cnblogs.com/huqingyu/p/200881.html