如何使用CreateFontA设置字体大小? [关闭]

问题描述 投票:-2回答:1

我不习惯CreateFontA,但我正在为使用此功能的游戏做一个mod,我也必须使用它。

我设法改变了字体,但是我在改变字体大小时遇到​​了一些麻烦。

我想使用字体大小11px,我该怎么做到这一点?我尝试将宽度和高度设置为11但是它出错了。

c++ winapi gdi
1个回答
2
投票

答案是(或至少可以)有点不平凡。

首先,你可以选择两个不同的高度:角色本身的高度,或者“普通”角色所居住的单元格的高度(但是,例如,像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");
© www.soinside.com 2019 - 2024. All rights reserved.