Цель: разукрасить (как в QT, Swing) текст на контролах. Например, в статус баре написать: Итого: <b>1 024,768</b> (цифра - жирным) или построить дерево классов/методов с подсветкой названий методов: void <b>function</b>(arg_type) - чтобы было лучше видно, причём использовать один и тот же подход в обоих случаях. По поводу частоты изменения текста, всё-таки думаю, что текст будет меняться не часто (т.е. это не редактор с подсветкой), но часто отрисовываться. Количество таких "строчек" может достигать 10^6. Больше - вряд ли.
Код:
// для пояснения - пример варианта №1
class Graphics
{
HDC fhandle;
std::vector<struct format_t> fformats;
public:
void renderText(int x, int y, const std::wstring& s)
{
SetTextAlign(fhandle, TA_UPDATECP|TA_BASELINE);
MoveToEx(fhandle, x, y, 0);
const char* pc = s.c_str();
while(*pc)
{
if (pc[0]!=0x1b || pc[1]==0)
{
TextOut(fhandle, 0, 0, pc, 1);
++pc;
}
else
{
struct format_t& fmt(fformats.at(pc[1]-1));
SetTextColor(fhandle, fmt.color);
SelectObject(fhandle, fmt.hfont);
pc+=2;
}
}
}
}
...
void ListBox::paint(Graphics& g)
{
// fitems[0] = "void \x1b\2foo\x1b\1(arg_type)"
unsigned begin = firstVisibleItem();
unsigned end = lastVisibleItem();
end -= begin;
for(unsigned a=0; a<end; ++a)
{
g.renderText(0, (1+a)*itemHeight(), fitems[begin + a]);
}
}
... и по поводу QSyntaxHilighter: я думал сделать что-то типа ostream, с соответствующими манипуляторами, который форматирует текст в буфер. Затем этот буфер отдавать контролу на хранение в качетстве содержимого. Вопрос в оптимальном хранении данных в буфере (быстрая отрисовка и экономия памяти)