Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цель: разукрасить (как в 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, с соответствующими манипуляторами, который форматирует текст в буфер. Затем этот буфер отдавать контролу на хранение в качетстве содержимого. Вопрос в оптимальном хранении данных в буфере (быстрая отрисовка и экономия памяти)

Отправлено: 12:22, 10-10-2006 | #5