Re[2]: GUI Терминал
От: Клоун Россия  
Дата: 16.11.05 10:34
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


А>>Привет всем! Помогите советом или наработками.

А>>Задача такая: нужно создать терминал (что то вроде консольного приложения, но он должен быть обязательно графический)
А>>как это можно сделать проще?
А>>У меня сечас получаеться так — создаю компонент TPanel (вообще не важно — использую просто его Handle), далее создаю каретку, перемещаю ее и вывожу TextOut'ом, но все это с буферами, координатами и жутко неудобной работой с фокусом элемента
А>>может есть какой компонент для этих целей?

V>Я не дельфист, забрел случайно, поэтому подскажу более "виндовое" решение.


V>1. Если это у тебя терминал, то у тебя должно быть понятие экранного буфера.

V>2. Экранный буфер может вмещать больше строк, чем видно на экране.
V>3. Конкатенировать строки в терминале не обязательно (т.е. терминал не обязан хранить свой текст в виде одной строки), можно прямо так и хранить — фиксированное количество символов на строку. Это избавит тебя от постоянного перераспределения памяти по приходу каждого символа. Т.е. можно использовать фиксированный для текущего сеанса буфер строк.
V>4. Очевидно, буфер может быть кольцевым, т.е. копировать при переводе строки ничего никуда не нужно.
V>5. Сделай отрисовку экранной области самостоятельно. У тебя фиксированный шрифт, ты можешь узнать ширину символа, затем вычисли "невалидный" прямоугольник в координатах символов (а не точек), затем прорисуй подстроки только требуемых строк (т.е. рисовать лишнее не обязательно)

V>Вроде, ничего сложного, но должно получиться легковесное по отношению к ресурсам и шустрое приложение.


Списибо большое — это то, чего я хотел
И вопрос еще — проблема с отрисовкой. Тут два варианта
1 — после каждого изменения буфера перерисовывать всю область окна
2 — после каждого изменения буфера просто прорисовывать один символ
имеються такие проблемы
1 — возможно мерцание экрана (я пока не проверял)
2 — (проверял) может оставаться след от курсора
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.