为什么用GDI+的DrawString,有的字体显示位置不正确?

时间:2021-10-03 12:47:20
在一个窗口中用GDI+的DrawSting输入一些文字,发现位置始终不正确。始终找不到原因,最后干脆把纵坐标设为0,发现有的字体确实显示位置正确了,有的字体却仍然显示位置不正确。
如果使用的字体为“新宋体”(中、英文均为“新宋体))(代码如下):

FontFamily CompFontFamily(L"新宋体");
Font cFont(&CompFontFamily, size, FontStyleRegular, UnitPixel);
PointF pt(xsRect[i].left, 0);
graph.DrawString(wstr, converted, &cFont, pt, &Brush);

此时显示的字体位置正确,紧靠图的最上方:
为什么用GDI+的DrawString,有的字体显示位置不正确?

(最上面一条横线就是图的最上方的一条横线)

可是如果中文字体换成“微软雅黑”(此时英文字体仍然为”新宋体“),显示效果如下:

为什么用GDI+的DrawString,有的字体显示位置不正确?

此时,英文由于仍然是“新宋体”,位置没有变化(但好象仍然没有显示在图的最上方,我觉得应该显示在最上方),而中文字体,却离最上方有四个像素之差。

这是怎么回事?为什么中文字体选“微软雅黑”的时候,显示位置不正确?而英文字体,即使是“新宋体”,显示位置也不正确(本来应该显示在最上方,和最上面一条横线相交)。而是都偏下了几个像素?

3 个解决方案

#1


两张图中,不管中文、英文,显示位置的纵坐标都是0,也就是说本来应该顶在最上面显示,但是两张图中,"di"两个英文字,都是“新宋体”,却没有顶在最上方。

而中文字体,上图是“新宋体”,确实顶在最上方显示了,但是下图的中文字体,是”微软雅黑“,明明显示的时候设的纵坐标是0,却离图片最上方有四个像素之差。

这是怎么回事?

#2


再看下图:本来设定那三个英文字母,显示的时候纵坐标是11,可是显示出来一看,字母的最上端的纵坐标是15,有四个像素之差。另外,字体大小为18,本来应该显示到11+18 = 29,可是却覆盖了下面那条绿线,那条绿线的纵坐标应该是31.

这是为什么?

为什么用GDI+的DrawString,有的字体显示位置不正确?

#3


忘了说了,上图的英文字体是Arial

#1


两张图中,不管中文、英文,显示位置的纵坐标都是0,也就是说本来应该顶在最上面显示,但是两张图中,"di"两个英文字,都是“新宋体”,却没有顶在最上方。

而中文字体,上图是“新宋体”,确实顶在最上方显示了,但是下图的中文字体,是”微软雅黑“,明明显示的时候设的纵坐标是0,却离图片最上方有四个像素之差。

这是怎么回事?

#2


再看下图:本来设定那三个英文字母,显示的时候纵坐标是11,可是显示出来一看,字母的最上端的纵坐标是15,有四个像素之差。另外,字体大小为18,本来应该显示到11+18 = 29,可是却覆盖了下面那条绿线,那条绿线的纵坐标应该是31.

这是为什么?

为什么用GDI+的DrawString,有的字体显示位置不正确?

#3


忘了说了,上图的英文字体是Arial