zoukankan      html  css  js  c++  java
  • 使用MeasureCharacterRanges时range个数超过31时,结果错的离谱

    如题,我也不知道为什么,测试代码:


     1     using namespace Gdiplus;
     2 
     3     wstring strLine = L"1个你好啊2个你好啊3个你好啊4个你好啊5个你好啊6个你好啊7个你好啊8个你好啊";
     4     const int wordCount = strLine.size();
     5 
     6     CPaintDC paintDc(this);
     7     Graphics g(paintDc.GetSafeHdc());
     8     Gdiplus::Font myfont(L"宋体"16, Gdiplus::FontStyleBold);
     9    
    10     const int region_count = wordCount + 1;
    11     Gdiplus::CharacterRange *wordRange = new Gdiplus::CharacterRange[region_count]; // 最后一个是整行的范围
    12 
    13     // 构建 region
    14     int wbegIndex = 0;
    15     int wordSize;
    16     for (int wordIndex = 0; wordIndex < wordCount; ++wordIndex){
    17         wordRange[wordIndex].First = wbegIndex;
    18         wordRange[wordIndex].Length = 1;
    19         wbegIndex += 1;
    20     }
    21 
    22     wordRange[wordCount].First = 0;
    23     wordRange[wordCount].Length = strLine.size();
    24 
    25     // measure region
    26     Region *wordRegion = new Region[region_count];
    27 
    28     StringFormat stringFormat;
    29     stringFormat.SetMeasurableCharacterRanges(region_count, wordRange);
    30 
    31     Gdiplus::RectF measureRect(00, INT_MAX, 100);
    32     g.MeasureCharacterRanges(strLine.c_str(), strLine.size(), &myfont, measureRect, &stringFormat, region_count, wordRegion );
    33 
    34     delete[] wordRange;
    35 
    36     // 获取每个词的rect
    37     RectF *wordRect = new Gdiplus::RectF[region_count];
    38 
    39     for (int i = 0; i < region_count; ++i){
    40         wordRegion[i].GetBounds(wordRect + i, &g);
    41     }
    42 
    43     delete[] wordRegion;

    44     delete[] wordRect; 

    要解决这个问题也很简单,在调用MeasureCharacterRanges时,使用如下代码

     1         int regionIndex = 0;
     2         while (regionIndex < region_count){
     3             int count = region_count - regionIndex;
     4             if (count > 31) count = 31;
     5 
     6             stringFormat->SetMeasurableCharacterRanges(count, wordRange + regionIndex);
     7             g.MeasureCharacterRanges(strLine.c_str(), strLine.size(), &myfont, measureRect, &stringFormat, count, wordRegion + regionIndex );
     8             
     9             regionIndex += count;

    10         } 

  • 相关阅读:
    Mobox企业网盘回收站文件清空与恢复的管控
    NAS设备部署后采用Mobox企业云盘来提升管理功能
    企业网盘支持对象存储帮助用户推行私有云
    阿里云登录界面无法输入账号及密码的解决方法
    团队协作管理-任务追踪管理
    windows10 家庭版 无法远程2012的解决
    bat删除多少天前的文件包含子目录
    企业网盘居然支持高速局域网文件传输工具(速度可达20M)
    防范永恒之蓝勒索病毒-XP、Win10文件共享怎样设置
    【OpenGL】学习笔记#2
  • 原文地址:https://www.cnblogs.com/hdtianfu/p/3071540.html
Copyright © 2011-2022 走看看