c++ - MeasureCharacterRanges 不适合字符?

标签 c++ text fonts gdi+

我尝试使用以下代码测量包含字符串中每个字符的区域:

void Draw(HDC dc)
{
    using namespace Gdiplus;
    Graphics graphics(dc);
    wstring chars;
    for(int i=32; i<127; ++i)
    {
        chars += i;
        chars += 32;
    }

    Font font(L"Times New Roman", 30, FontStyleRegular, UnitPoint);
    TextRenderingHint hint = TextRenderingHintAntiAlias    ;
    const StringFormat* pStringFormat = StringFormat::GenericTypographic();
    StringFormat MeasureFormat(pStringFormat);
    const float Offset = 60.f;
    RectF   layout(Offset, Offset, m_ScreenWidth - Offset*2, m_ScreenHeight - Offset*2);
    std::vector<RectF> charSize;
    for(size_t i=0; i<chars.size(); ++i)
    {
        if(i%2 == 0)
        {
            CharacterRange range(i, 1);
            MeasureFormat.SetMeasurableCharacterRanges(1, &range);
            Region region;

            graphics.MeasureCharacterRanges(chars.c_str(), -1, &font, layout, &MeasureFormat, 1, &region);
            RectF rec;
            region.GetBounds(&rec, &graphics);   
            charSize.push_back(rec);
        }
    }

    graphics.SetTextRenderingHint(hint);

    for(size_t i=0 ; i<charSize.size(); ++i)
    {
        graphics.FillRectangle(&SolidBrush(0xaa998844), charSize[i]);
    }

    graphics.DrawString(chars.c_str(), -1, &font, layout, pStringFormat, &SolidBrush(0xff0000ff));
}

这是结果:

screen shot

正如您所看到的,字母“f”和“g”的区域并没有完美地包围这些字符。我该如何解决这个问题?

最佳答案

发生这种情况是因为这些字符被设计为与相邻字符悬垂。您突出显示的宽度是下一个字符应该开始的距离,这不一定是字符的边界框。

我不是 GDI+ 方面的专家,但您可能需要更改格式标志以告诉它您不希望字符超出边界框。特别是StringFormatFlagsNoFitBlackBox看起来很有用。

如果您直接使用 GDI,您可能需要调用 GetCharABCWidths确定角色是否可以超出测量的边界框以及有多少,并手动调整它。

关于c++ - MeasureCharacterRanges 不适合字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483572/

相关文章:

c++ - 显式默认的移动构造函数

javascript - Onclick 文本出现在 div 旁边,而不是在下面

html - 如何在不使用 CDN 的情况下包含 font awesome 4.1 的本地文件?

html - 在网络上使用特殊字符符号时应该注意什么?

c++ - 限制程序对 unc 服务器的访问

c++ - 了解 Negamax 的约束

c++ - 调用exit时使用vector,c++不清楚内存泄漏

arraylist - Flutter:语音到文本

jquery - 调整窗口大小时自动调整文本(字体大小)?

python - tkinter.font.Font() 不起作用