Не пытайтесь повторить это самостоятельно!
...потому что лучше пару раз почесать затылок, склонившись над листом бумаги, и сразу увидеть Корень Зла. Иначе он обовьет ваше несчастное тело быстрее, чем вы что-то сможете сделать. И вам придется долго и упорно грызть это корневище, чтобы, наконец, выбратся из этого персонального ада.
А корень этот на вкус напоминает кусок гнилого кода.. Чем, собственно, он и является.
Хотя мне, наверное, следовало бы предупредить вас в
самом начале, потому что сейчас речь пойдет о банальнейших
проблемах производительности.
Итак, в прошлый раз
мы построили интерфейс, представляющий текстовое поле в виде бесконечного
прямоугольного массива символов. Так что можно идти переопределять процедуру
прорисовки окна. Так, а раз достаточно просто перерисовать каждый отдельный
символ, то почему бы при перерисовке просто не вызвать m*n раз процедуру,
рисующую один-единственный символ? А теперь объявим эту процедуру абстрактной.
Отлично, теперь мы имеем довольно общий шаблон редактора, который всего лишь
надо параметризовать процедурой прорисовки. То есть теперь, в принципе,
есть на что посмотреть! Да, мерзко писать код, не имея возможности запустить
его и посмотреть, что получится. И мы порождаем подкласс, назовем его
ColorApxEd, который просто рисует цветные буковки на цветном фоне:
Отлично, все работает! Но так не бывает. Этот скриншот был сделан намного
позже. Вначале, конечно же, ничего не работало. Но мало-помалу смертельные
баги были раздавлены, и на свет явился очень мерзкий и живучий таракан.
Дело в том, что (1) при нажатии любой клавиши перерисовывалось все окно, и
(2) при перерисовке текст мелькал. "Приехали".
Что ж, лучше поздно, чем никогда, наконец, взяться за ум. Тут-то я и узнал, что
же такое двойная буферизация. А также понял, что прорисовку необходимо
выполнять с умом - ровно то, что нужно, и ничего более. Еще одна неделя работы.
Двойную буферизацию я прикрутил быстро, и все потихоньку начало работать.
И можно было, наконец, писать градиентную подсветку.
Вот что у меня получилось. Почему-то это было не то, что я хотел. К тому же,
оно ужасно тормозило. Поэтому я решил применить тяжелую артиллерию - кэш
фрагментов градиента. Таким образом примитивнейший, неоптимизированный расчет
градиента выполнялся только единожды - при первом появлении данного куска
градиента. На этом шаге у меня, как всегда, пропало желание доводить до ума
почти свершенное, и я решил поскорее сделать простейший редактор на основе
только что созданного компонента. Небезосновательно полагая, что нигде более
я его и не применю.
Тут-то все и умерло, ибо я уехал учиться.
Но через два года, этим летом, я решил покопаться в старых наработках.
И наткнулся на APXN. И ужасно удивился, что "почти всё почти работает".
К тому же, на новом компьютере скорость перерисовки была вполне приемлемой.
Кстати, новый компьютер с первого взгляда и помедленнее должен быть -
1600 MHz против старых 2400. Вот что значит Intel Core Duo, даже и не "2", да
и программа многопоточность не использует.
И я просто занялся шлифовкой того, что было. Решил сделать "конфетку" из
"будто бы и непригодного материала". И если раньше я пытался в нем что-то
написать, и инстинктивно пытался Ctrl+прыгать по тексту, а также тыкать Ctrl+Del,
и оно не работало, и я тут же проклинал эту гадость и возвращался к Notepad++,
то после того, как я реализовал полный спектр клавиатурных команд, стало можно
с ним работать! Вроде мелочь, а ведь именно из мелочей складывается настроение.
А еще я поленился прикручивать поддержку одновременного открытия нескольких
файлов, но заменил это кое-чем, не встречающимся в большинстве "блокнотов" -
программа запоминает состояние (позицию прокрутки, каретку, закладки...)
для каждого файла. Заодно вынуждает почаще сохраняться (в пику проклятому n++,
не раз терявшему бесценные байты при неожиданной смерти системы :)
Теперь я уверовал в истинную силу юзабилити, когда пара строк кода просто делает
работу возможной. А еще пара строк - приятной.
P. S. Только что прочитал одну отвратительно написанную книжечку
по методам программирования, и с ужасом понял, что сам пишу так же.
Так что не обращайте внимания на эти три небольшие заметки.
Впрочем, судите строго.