2

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

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));
}

这是结果:

截屏

如您所见,字母“f”和“g”的区域并没有完美地包含这些字符。我该如何解决 ?

4

1 回答 1

3

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

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

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

于 2013-05-10T15:56:26.327 回答