1
我試圖實現將語法高亮添加到winapi的RichEdit的代碼,因此我搜索必須着色的文本範圍,但是如果使用EM_EXSETSEL消息選擇範圍使用EM_SETCHARFORMAT消息進行格式化,它非常緩慢,並且全部被用戶看到。我如何更快地改變字符格式?更改字符格式的範圍
我試圖實現將語法高亮添加到winapi的RichEdit的代碼,因此我搜索必須着色的文本範圍,但是如果使用EM_EXSETSEL消息選擇範圍使用EM_SETCHARFORMAT消息進行格式化,它非常緩慢,並且全部被用戶看到。我如何更快地改變字符格式?更改字符格式的範圍
我是通過RTF做到的:它是一種標記語言,概念上類似於HTML。一次插入顏色指令並重新加載緩衝區。爲了真實,我使用了MFC,但我認爲CRichEdit是一個薄層,不會增加更多功能(當然除了框架集成)。這裏有一些代碼(很老,我很抱歉):
....
// reformat line
//
void RichEditSyntaxColor::FmtLine(CRichEditCtrl &c, int nLine)
{
int iLine = c.LineIndex(nLine),
lLine = c.LineLength(iLine);
if (lLine > 0)
{
fmt(c, nLine, lLine);
long ss, es;
c.GetSel(ss, es);
c.ShowWindow(SW_HIDE);
stream(c, iLine, lLine);
c.ShowWindow(SW_SHOW);
c.SetSel(ss, es);
}
}
// apply formatted streaming to selected pos
//
void RichEditSyntaxColor::stream(CRichEditCtrl &c, int iLine, int lLine)
{
c.SetSel(iLine, iLine + lLine);
EDITSTREAM eds = { DWORD(this), 0, fmtLineCb };
c.StreamIn(SF_RTF|SFF_SELECTION, eds);
}
// required callback
//
DWORD CALLBACK RichEditSyntaxColor::fmtLineCb(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
RichEditSyntaxColor* pCookie = (RichEditSyntaxColor*)dwCookie;
memcpy(pbBuff, pCookie->obuf, *pcb = pCookie->os.pcount());
return 0;
}
// colors data, useful to configure
//
SyntaxColor::aColor SyntaxColor::_colorsDef[] = {
{"Atom", RGB(16, 16, 32)},
{"Number", RGB(128, 32,128)},
{"Var", RGB(16, 16,255)},
{"String", RGB(128,128,128)},
{"Comment", RGB(128,128, 20)}, //RGB(32,128, 32)},
{"SepChar", RGB(196, 32, 32)}
};
char SyntaxColor::_colorsStr[];
void SyntaxColor::Table2String()
{
ostringstream s(_colorsStr);//, sizeof _colorsStr);
s << "{\\colortbl;";
for (int i = 0; i < __maxTag__; i++)
{
COLORREF c = _colorsDef[i].value;
s << "\\red" << int(GetRValue(c))
<< "\\green" << int(GetGValue(c))
<< "\\blue" << int(GetBValue(c))
<< ';';
}
s << '}' << ends;
}
...
我成功地用你的方法,謝謝! – Triton 2012-02-18 17:12:09