C++使用Uniscribe进行文字自动换行的计算和渲染(九)

2014-11-24 09:13:54 · 作者: · 浏览: 9
ribeData();
return false;
}
};

class ScriptParagraph : public Object
{
public:
List> lines;
};

class ScriptDocument : public Object
{
public:
List> paragraphs;
};

Ptr<ScriptDocument> BuildScriptParagraphs(List>& fragments)
{
Ptr<ScriptDocument> document=new ScriptDocument;
document->paragraphs.Clear();
Regex regex(L"\r\n");
Ptr<ScriptParagraph> currentParagraph;
Ptr<ScriptLine> currentLine;
Dictionary> fonts;

FOREACH(Ptr, fragment, fragments.Wrap())
{
WString fragmentFingerPrint=fragment->GetFingerPrint();
int index=fonts.Keys().IndexOf(fragmentFingerPrint);
if(index==-1)
{
fragment->fontObject=new WinFont(fragment->font, fragment->size, 0, 0, 0, (fragment->bold FW_BOLD:FW_NORMAL), false, false, false, true);
fonts.Add(fragmentFingerPrint, fragment->fontObject);
}
else
{
fragment->fontObject=fonts.Values()[index];
}

if(!currentParagraph)
{
currentParagraph=new ScriptParagraph;
document->paragraphs.Add(currentParagraph);
}

if(fragment->paragraph)
{
currentParagraph=0;
currentLine=0;
}
else
{
RegexMatch::List matches;
regex.Split(fragment->text, true, matches);
for(int i=0;i {
Ptr match=matches[i];
if(i>0)
{
currentLine=0;
}
if(!currentLine)
{
currentLine=new ScriptLine;
currentParagraph->lines.Add(currentLine);
}
currentLine->documentFragments.Add(new DocumentFragment(fragment, match->Result().Value()));
}
}
}

HDC hdc=CreateCompatibleDC(NULL);
WinProxyDC dc;
dc.Initialize(hdc);
FOREACH(Ptr<ScriptParagraph>, paragraph, document->paragraphs.Wrap())
{
FOREACH(Ptr<ScriptLine>, line, paragraph->lines.Wrap())
{
line->BuildUniscribeData(&dc);
}
}
DeleteDC(hdc);

return document;
}

/***********************************************************************
TestWindow
***********************************************************************/

class TestWindow : public GuiWindow
{
protected:
Ptr<ScriptDocument> document;
Ptr messageFont;

void element_Rendering(GuiGraphicsComposition* composition, GuiGDIElementEventArgs& arguments)
{
WinDC* dc=arguments.dc;
Rect bounds=arguments.bounds;
if(document)
{
int x=bounds.Left()+10;
int y=bounds.Top()+10;
int w=bounds.Width()-20;
int h=bounds.