gpt4 book ai didi

c++ - RichEdit 语法高亮

转载 作者:可可西里 更新时间:2023-11-01 11:53:55 29 4
gpt4 key购买 nike

我需要你的帮助!所以,我正在创建一个带有语法高亮器的 RichEdit,我是这样做的:

   SendMessage(hWin, WM_SETREDRAW, false, 0);
CHARFORMAT2 format, old;
format.cbSize = sizeof(format);
old.cbSize = sizeof(format);
MainRich.GetFormat(SCF_DEFAULT, &format);
MainRich.GetFormat(SCF_DEFAULT, &old);
format.dwMask = CFM_BOLD;
format.dwEffects = CFE_BOLD;
CHARRANGE* c = MainRich.GetSelectionRange();
int length = MainRich.GetLength();
string str = string(MainRich.GetText());
#define hl "true" //Example of syntax for highlight
int last = 0;
while (str.find(hl, last)!=string::npos)
{
MainRich.Select(str.find(hl, last), str.find(hl, last)+strlen(hl));
MainRich.SetFormat(SCF_SELECTION, &format);
last = str.find(hl, last)+strlen(hl);
}
MainRich.Select(c->cpMin, c->cpMax);
MainRich.SetFormat(SCF_SELECTION, &old);
SendMessage(hWin, WM_SETREDRAW, true, 0);
UpdateWindow(hWin);
}

但是我看到在有很多高亮的大文件中它变得迟钝,你有更好的方法吗?我检查了Iczelion's Assembly但是那段代码一团糟,他似乎在文本前面画了高光但是这样选择不起作用,对吧?如果是这样,你能给我一些提示吗?谢谢!

最佳答案

我发现最快的方法是构建原始 RTF 文档,然后通过 EM_STREAMIN 将其流式传输到控件。消息。

EDITSTREAM stream;
stream.dwCookie = (DWORD_PTR)&streamData; // pointer your rtf data
stream.dwError = 0;
stream.pfnCallback = (EDITSTREAMCALLBACK)RtfStreamCallback; // callback which will push down the next chunk of rtf data when needed

LRESULT bytesAccepted = 0;
bytesAccepted = SendMessage(hWindow, EM_STREAMIN, SF_RTF, (LPARAM)&stream);

要记住的另一件事是,您使用的 RTF 控件对性能有严重影响。当我这样做时,我发现默认控件(由 Windows XP 提供)慢得可怕,但是 Microsoft Office 提供的 RICHED20.DLL 快了几个数量级。您应该试用您有权访问的版本并进行一些性能比较。

链接到 1.6 RTF Specification

关于c++ - RichEdit 语法高亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22109514/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com