Я пытаюсь реализовать код, чтобы добавить подсветку синтаксиса в richedit winapi, поэтому я просматриваю диапазоны текста, которые я должен раскрасить, но если я выберу диапазон с сообщением EM_EXSETSEL для форматирования с сообщением EM_SETCHARFORMAT, это очень медленно, и все это видно пользователям. Как я могу изменить форматирование символов быстрее?Изменение символьного форматирования диапазона
1
A
ответ
1
Я сделал это через 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;
}
...
Смежные вопросы
- 1. изменение форматирования текста из диапазона dynamicaly
- 2. Изменение выбранных элементов символьного вектора
- 3. time.strptime изменение выходного форматирования
- 4. Динамическое изменение форматирования
- 5. Java: изменение форматирования локали
- 6. Изменение ASP.NET тег форматирования
- 7. изменение форматирования JTextField
- 8. Изменение значения ячейки форматирования
- 9. Изменение двойного символьного массива в Android
- 10. VBA - Копирование форматирования диапазона в массив
- 11. PHPExcel условного форматирования диапазона с формулой
- 12. jQuery Проверить правила форматирования для пределов диапазона
- 13. Java маска форматирования для диапазона дат
- 14. индекс Кортеж вне диапазона в строке форматирования
- 15. IndexError: индекс кортеж из диапазона - Строка форматирования
- 16. Изменение форматирования по умолчанию Eclipse
- 17. изменение SQLDeveloper случай (нарушение форматирования)
- 18. Изменение диапазона Перерывы Sub
- 19. android wifi изменение диапазона
- 20. Изменение текста диапазона
- 21. Изменение текста диапазона класса
- 22. Изменение диапазона переменных NetLogo
- 23. Изменение желаемого диапазона
- 24. Изменение содержимого класса диапазона
- 25. Изменение именованного диапазона
- 26. Преобразование и изменение диапазона диапазона в массиве
- 27. Изменение форматирования, если ячейка находится в диапазоне
- 28. Преобразование символьного символьного обозначения в строку unicode
- 29. VBA Writing to Word, изменение шрифта форматирования
- 30. Изменение диапазона d3 пуля диаграмма
Мне удалось с помощью вашего метода, спасибо! – Triton