我不习惯CreateFontA
,但我正在为使用此功能的游戏做一个mod,我也必须使用它。
我设法改变了字体,但是我在改变字体大小时遇到了一些麻烦。
我想使用字体大小11px,我该怎么做到这一点?我尝试将宽度和高度设置为11但是它出错了。
答案是(或至少可以)有点不平凡。
首先,你可以选择两个不同的高度:角色本身的高度,或者“普通”角色所居住的单元格的高度(但是,例如,像y
这样的下行字母通常会延伸到细胞)。因此,对于相同大小的字体,字符单元格通常会略大于字符本身的大小。
要根据字符单元格高度选择字体,请为高度传递正数。要根据字符本身的高度进行选择,请传递一个负数(其绝对值将用作高度)。
因此,我们假设您希望角色本身高11点(因此我们需要为高度传递负数),并且您希望宽度成为手头字体的默认值。我们还假设您正在处理MM_TEXT模式,其中逻辑单位等于一个像素。
由于Windows使用该术语,一个点是1/72英寸(注意:72英寸的英寸不是通用的 - 例如,有些使用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");