答案是(或至少可以)有些不平凡。
首先,您可以选择两种不同的高度:字符本身的高度,或“正常”字符所在的单元格的高度(例如,带有降序的字母,如y通常会延伸到细胞外)。所以,同样大小的字体,字符单元格通常会比字符本身的大小略大。
要根据字符 cell 的高度选择字体,请为高度传递一个正数。要根据字符本身的高度进行选择,请传递一个负数(其绝对值将用作高度)。
假设您希望字符 他们自己 的高度为 11 磅(因此我们需要为高度传递一个负数),并且您希望宽度为默认值对于手头的字体。我们还假设您正在处理 MM_TEXT 模式,其中一个逻辑单位等于一个像素。
由于 Windows 使用该术语,一点是 1/72nd 英寸(注意:72 磅到 1 英寸并不是通用的 - 例如,有些使用 72.72 磅到英寸相反——如果您需要遵守“点”的不同定义,请随意修改以下代码)。
因此,要计算尺寸,我们可以先检索屏幕上每英寸(垂直)的像素数,然后计算正确点数的像素数:
static const int points_per_inch = 72;
int pixels_per_inch = GetDeviceCaps(hDC, LOGPIXELSY);
int pixels_height = - (points * pixels_per_inch / points_per_inch);
[Microsoft 有一个 MulDiv 函数来确保在计算中不会出现中间值溢出,但除非您使用 16 位机器或真正巨大的字体,否则这主要是寻找问题的解决方案。]
由于我们想要默认宽度,我们将传递 0 作为宽度。
所以,我们最终会得到这样的结果:
HFONT font = CreateFont(pixels_height, 0, // size
0, 0, 0, // normal orientation
FW_NORMAL, // normal weight--e.g., bold would be FW_BOLD
false, false, false, // not italic, underlined or strike out
DEFAULT_CHARSET,
OUT_OUTLINE_PRECIS, // select only outline (not bitmap) fonts
CLIP_DEFAULT_PRECIS,
CLEARTYPE_QUALITY,
VARIABLE_PITCH | FF_SWISS,
"Arial");