GDIPlus::DrawString计算一定区域显示字符个数的问题

mltong 2014-03-31 11:33:31
最开始的需求是想在一个矩形区域内显示字符串,但需要控制“行间距”。但查了相关资料,好像DrawString并没有直接提供控制行间距的方法。于是利用了有人提出的手动控制输出,即将文本分段,手动控制每行的输出位置。

但现在有个问题是我用MeasureString计算每行能显示的字符个数的时候,文本内容不一样的时候,返回的个数是不一样的。
如果是纯汉字的,返回8,如果带了写数字或者标点符号的时候是5。而我需要根据这个数字去分段原始的文本,假设是后者的情况,如下图


看空间明明可以再显示字符的,可是被换行了。如果顺着这个现象,我似乎应该计算那些显示宽度比较窄的字符,把它们算做半个字符,这似乎也太麻烦了。不知道有什么方法可以简单的解决这个问题,或者能直接解决最原始的问题就更好了。

谢谢!
...全文
251 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
mltong 2014-03-31
  • 打赏
  • 举报
回复
下午又重新思考了这个问题,再重新审视MeasureString函数,才发现为什么要传入一个字符串呢?我将思维定型在了每行都是固定字符个数了,每行的个数是可以变化的啊,这也就是为什么不同的字符串(开头的部分)计算出来的结果不一样。 于是立马拔掉耳机,开始按照下面的思路重新写了写个函数。大致就是每次计算当前剩余字符串在一行的区域内能显示的字符个数,然后将子串截取显示,再更新剩余字符串,依次循环。

    //
    // 将文本分段显示,以控制行间距
    //
    const Gdiplus::SizeF layout_size(rect.Width, font.GetHeight(&graph)); 
    Gdiplus::SizeF size;

    std::wstring remain_text = text; // 当前剩余显示的文本

    for (unsigned int i = 0; i < kMaxLineCount; ++i)
    {
        int char_count = 0; // 当前行能显示的字符个数

        Gdiplus::Status status = graph.MeasureString(
            remain_text.c_str(),
            remain_text.length(),
            &font,
            layout_size,
            &format,
            &size,
            &char_count,
            NULL);

        if (char_count > 0)
        {
            // 截取当前行可以显示的文本并显示
            std::wstring substr = remain_text.substr(0, char_count); 
            Gdiplus::RectF subrc(rect.X, rect.Y + i * kLineHeight, layout_size.Width, layout_size.Height);
            graph.DrawString(substr.c_str(), substr.length(), &font, subrc, &format, &brush);

            // 更新剩余文本信息
            remain_text.erase(0, char_count);

            if (remain_text.empty())
                break;
        }
        else
        {
            break;
        }
    }

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧