C++ 更改范围的字符格式

C++ 更改范围的字符格式,c++,c,winapi,syntax-highlighting,richedit,C++,C,Winapi,Syntax Highlighting,Richedit,我正在尝试实现一个代码,将语法高亮显示添加到winapi的richedit中,因此我搜索必须着色的文本范围,但是如果我选择带有EM_-exsetel消息的范围以使用EM_-SETCHARFORMAT消息格式化,则速度非常慢,用户可以看到所有内容。如何更快地更改字符格式?我是通过RTF完成的:它是一种标记语言,在概念上类似于HTML。立即插入颜色指令并重新加载缓冲区。诚然,我使用了MFC,但我认为CRichEdit是一个很薄的层,没有添加更多的功能(当然,除了框架集成)。这里有一些代码(很旧,很抱

我正在尝试实现一个代码,将语法高亮显示添加到winapi的richedit中,因此我搜索必须着色的文本范围,但是如果我选择带有EM_-exsetel消息的范围以使用EM_-SETCHARFORMAT消息格式化,则速度非常慢,用户可以看到所有内容。如何更快地更改字符格式?

我是通过RTF完成的:它是一种标记语言,在概念上类似于HTML。立即插入颜色指令并重新加载缓冲区。诚然,我使用了MFC,但我认为CRichEdit是一个很薄的层,没有添加更多的功能(当然,除了框架集成)。这里有一些代码(很旧,很抱歉):

。。。。
//重整生产线
//
void RichEditSyntaxColor::FmtLine(CRichEditCtrl&c,intnline)
{
int iLine=c.LineIndex(nLine),
直线=c.线长度(直线);
如果(线性>0)
{
fmt(c、nLine、lLine);
长ss,es;
c、 GetSel(ss,es);
c、 显示窗口(SW_隐藏);
溪流(c、iLine、iLine);
c、 ShowWindow(SW_SHOW);
c、 固定器(不锈钢、不锈钢);
}
}
//将格式化流媒体应用于所选pos
//
void RichEditSyntaxColor::stream(CRichEditCtrl&c、int-iLine、int-lLine)
{
c、 设定值(直线、直线+直线);
EDITSTREAM-eds={DWORD(this),0,fmtLineCb};
c、 流线型(SF|RTF | SF|U选择,eds);
}       
//必需的回调
//
DWORD回调RichEditSyntaxColor::fmtLineCb(DWORD dwCookie,LPBYTE pbBuff,LONG cb,LONG*pcb)
{
RichEditSyntaxColor*pCookie=(RichEditSyntaxColor*)dwCookie;
memcpy(pbBuff,pCookie->obuf,*pcb=pCookie->os.pcount());
返回0;
}
//颜色数据,用于配置
//
SyntaxColor::aColor SyntaxColor::U colorsDF[]={
{“原子”,RGB(16,16,32)},
{“数字”,RGB(12832128)},
{“Var”,RGB(16,16255)},
{“字符串”,RGB(128128)},
{“评论”,RGB(128128,20)},//RGB(32128,32)},
{“SepChar”,RGB(196,32,32)}
};
char SyntaxColor::_colorsStr[];
void SyntaxColor::Table2String()
{
ostringstream s(_colorsStr);/,sizeof _colorsStr);

s我是通过RTF实现的:这是一种标记语言,概念上类似于HTML。立即插入颜色指令并重新加载缓冲区。说实话,我使用了MFC,但我认为CRichEdit是一个薄层,没有添加任何进一步的功能(当然,除了框架集成)。下面是一些代码(很旧,很抱歉):

。。。。
//重整生产线
//
void RichEditSyntaxColor::FmtLine(CRichEditCtrl&c,intnline)
{
int iLine=c.LineIndex(nLine),
直线=c.线长度(直线);
如果(线性>0)
{
fmt(c、nLine、lLine);
长ss,es;
c、 GetSel(ss,es);
c、 显示窗口(SW_隐藏);
溪流(c、iLine、iLine);
c、 ShowWindow(SW_SHOW);
c、 固定器(不锈钢、不锈钢);
}
}
//将格式化流媒体应用于所选pos
//
void RichEditSyntaxColor::stream(CRichEditCtrl&c、int-iLine、int-lLine)
{
c、 设定值(直线、直线+直线);
EDITSTREAM-eds={DWORD(this),0,fmtLineCb};
c、 流线型(SF|RTF | SF|U选择,eds);
}       
//必需的回调
//
DWORD回调RichEditSyntaxColor::fmtLineCb(DWORD dwCookie,LPBYTE pbBuff,LONG cb,LONG*pcb)
{
RichEditSyntaxColor*pCookie=(RichEditSyntaxColor*)dwCookie;
memcpy(pbBuff,pCookie->obuf,*pcb=pCookie->os.pcount());
返回0;
}
//颜色数据,用于配置
//
SyntaxColor::aColor SyntaxColor::U colorsDF[]={
{“原子”,RGB(16,16,32)},
{“数字”,RGB(12832128)},
{“Var”,RGB(16,16255)},
{“字符串”,RGB(128128)},
{“评论”,RGB(128128,20)},//RGB(32128,32)},
{“SepChar”,RGB(196,32,32)}
};
char SyntaxColor::_colorsStr[];
void SyntaxColor::Table2String()
{
ostringstream s(_colorsStr);/,sizeof _colorsStr);
s
....

// 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;
}
...