Hi,
I used the following code. But, I observed the problem! for "Character 32".
Does anyone have information about the problem?
class CMeasureCharacterRanges
{
public:
class CCharLayout
{
public:
WCHAR chr;
Gdiplus::RectF bound;
CCharLayout(const WCHAR chracter)
{
chr = chracter;
};
CCharLayout& operator=(const CCharLayout& c)
{
if (&c != this) {
chr = c.chr;
bound = c.bound;
}
return( *this );
};
};
CMeasureCharacterRanges();
~CMeasureCharacterRanges();
void SetString(const Gdiplus::Graphics *graphics,
const WCHAR *string,
const Gdiplus::Font *font,
const Gdiplus::RectF &layoutRect,
const Gdiplus::StringFormat *stringFormat);
int GetCharCount(void);
CCharLayout* GetCharLayout(int index);
void Clear(void);
private:
std::vector< CCharLayout > m_chars;
};
CMeasureCharacterRanges::CMeasureCharacterRanges()
{
}
CMeasureCharacterRanges::~CMeasureCharacterRanges()
{
Clear();
}
void CMeasureCharacterRanges::SetString(const Gdiplus::Graphics *graphics,
const WCHAR *string,
const Gdiplus::Font *font,
const Gdiplus::RectF &layoutRect,
const Gdiplus::StringFormat *stringFormat)
{
Clear();
INT length = 0;
if ((NULL == string) || ((length = wcslen(string)) == 0)) {
return;
}
INT pie, pos = 0, i, regionCount;
INT remain = length;
while (remain > 0) {
pie = ((remain > 32) ? 32 : remain);
Gdiplus::CharacterRange *pcharRange = new Gdiplus::CharacterRange[pie];
for (i = 0; i < pie; i++) {
pcharRange[i] = Gdiplus::CharacterRange((pos + i), 1);
m_chars.push_back(CCharLayout(string[pos + i]));
}
Gdiplus::StringFormat strFormat(stringFormat);
strFormat.SetMeasurableCharacterRanges(pie, pcharRange);
regionCount = strFormat.GetMeasurableCharacterRangeCount();
Gdiplus::Region *pRegion = new Gdiplus::Region[regionCount];
graphics->MeasureCharacterRanges(string, length, font, layoutRect, &strFormat, regionCount, pRegion);
for (i = 0; i < regionCount; i++) {
pRegion[i].GetBounds(&(m_chars[pos + i].bound), graphics);
ATLTRACE(TEXT("index=%u, char=(%u)%c, x=%u, y=%u, w=%u, h=%u\n"),
pos + i,
(INT)m_chars[pos + i].chr, m_chars[pos + i].chr,
(INT)m_chars[pos + i].bound.X,
(INT)m_chars[pos + i].bound.Y,
(INT)m_chars[pos + i].bound.Width,
(INT)m_chars[pos + i].bound.Height);
}
SAFE_DELETE( pRegion );
SAFE_DELETE( pcharRange );
pos += pie;
remain -= pie;
}
}
int CMeasureCharacterRanges::GetCharCount(void)
{
return( m_chars.size() );
}
CMeasureCharacterRanges::CCharLayout* CMeasureCharacterRanges::GetCharLayout(int index)
{
int count = m_chars.size();
if ((count == 0) || (index < 0) || (index >= count)) {
return( NULL );
}
return( &(m_chars[index]) );
}
void CMeasureCharacterRanges::Clear(void)
{
m_chars.clear();
}
Output
Text = "GDI+" & vbTab & "text" & vbTab & "layout is resolution independent," & vbCrLf & "and thus different from GDI."
index=0, char=(71)G, x=3, y=0, w=12, h=19
index=1, char=(68)D, x=15, y=0, w=12, h=19
index=2, char=(73)I, x=27, y=0, w=5, h=19
index=3, char=(43)+, x=32, y=0, w=11, h=19
index=4, char=(9)vbTab, x=43, y=0, w=24, h=19
index=5, char=(116)t, x=67, y=0, w=6, h=19
index=6, char=(101)e, x=73, y=0, w=10, h=19
index=7, char=(120)x, x=83, y=0, w=10, h=19
index=8, char=(116)t, x=93, y=0, w=6, h=19
index=9, char=(9)vbTab, x=99, y=0, w=32, h=19
index=10, char=(108)l, x=131, y=0, w=5, h=19
index=11, char=(97)a, x=136, y=0, w=9, h=19
index=12, char=(121)y, x=145, y=0, w=9, h=19
index=13, char=(111)o, x=154, y=0, w=10, h=19
index=14, char=(117)u, x=164, y=0, w=9, h=19
index=15, char=(116)t, x=173, y=0, w=5, h=19
index=16, char=(32) , x=178, y=0, w=5, h=19
index=17, char=(105)i, x=183, y=0, w=5, h=19
index=18, char=(115)s, x=188, y=0, w=8, h=19
index=19, char=(32) , x=0, y=0, w=0, h=0 (on WordWrap)
index=20, char=(114)r, x=3, y=19, w=5, h=19
index=21, char=(101)e, x=8, y=19, w=9, h=19
index=22, char=(115)s, x=17, y=19, w=8, h=19
index=23, char=(111)o, x=25, y=19, w=10, h=19
index=24, char=(108)l, x=35, y=19, w=5, h=19
index=25, char=(117)u, x=40, y=19, w=9, h=19
index=26, char=(116)t, x=49, y=19, w=5, h=19
index=27, char=(105)i, x=54, y=19, w=5, h=19
index=28, char=(111)o, x=59, y=19, w=10, h=19
index=29, char=(110)n, x=69, y=19, w=9, h=19
index=30, char=(32) , x=78, y=19, w=5, h=19
index=31, char=(105)i, x=83, y=19, w=5, h=19
index=32, char=(110)n, x=88, y=19, w=9, h=19
index=33, char=(100)d, x=97, y=19, w=11, h=19
index=34, char=(101)e, x=108, y=19, w=9, h=19
index=35, char=(112)p, x=117, y=19, w=10, h=19
index=36, char=(101)e, x=127, y=19, w=9, h=19
index=37, char=(110)n, x=136, y=19, w=9, h=19
index=38, char=(100)d, x=145, y=19, w=11, h=19
index=39, char=(101)e, x=156, y=19, w=9, h=19
index=40, char=(110)n, x=165, y=19, w=9, h=19
index=41, char=(116)t, x=174, y=19, w=5, h=19
index=42, char=(44),, x=179, y=19, w=4, h=19
index=43, char=(13)vbCr, x=0, y=0, w=0, h=0
index=44, char=(10)vbLf, x=0, y=0, w=0, h=0 (on WordWrap)
index=45, char=(97)a, x=3, y=38, w=9, h=18
index=46, char=(110)n, x=12, y=38, w=9, h=18
index=47, char=(100)d, x=21, y=38, w=11, h=18
index=48, char=(32) , x=32, y=38, w=6, h=18
index=49, char=(116)t, x=38, y=38, w=5, h=18
index=50, char=(104)h, x=43, y=38, w=9, h=18
index=51, char=(117)u, x=52, y=38, w=9, h=18
index=52, char=(115)s, x=61, y=38, w=8, h=18
index=53, char=(32) , x=69, y=38, w=5, h=18
index=54, char=(100)d, x=74, y=38, w=11, h=18
index=55, char=(105)i, x=85, y=38, w=5, h=18
index=56, char=(102)f, x=90, y=38, w=5, h=18
index=57, char=(102)f, x=95, y=38, w=5, h=18
index=58, char=(101)e, x=100, y=38, w=9, h=18
index=59, char=(114)r, x=109, y=38, w=5, h=18
index=60, char=(101)e, x=114, y=38, w=9, h=18
index=61, char=(110)n, x=123, y=38, w=9, h=18
index=62, char=(116)t, x=132, y=38, w=5, h=18
index=63, char=(32) , x=137, y=38, w=5, h=18
index=64, char=(102)f, x=142, y=38, w=5, h=18
index=65, char=(114)r, x=147, y=38, w=5, h=18
index=66, char=(111)o, x=152, y=38, w=10, h=18
index=67, char=(109)m, x=162, y=38, w=13, h=18
index=68, char=(32) , x=0, y=0, w=0, h=0 (on WordWrap)
index=69, char=(71)G, x=3, y=57, w=12, h=18
index=70, char=(68)D, x=15, y=57, w=12, h=18
index=71, char=(73)I, x=27, y=57, w=5, h=18
index=72, char=(46)., x=32, y=57, w=4, h=18
|