使用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         } 

原文地址:https://www.cnblogs.com/hdtianfu/p/3071540.html