October 8, 2018

ppSearchMemo

Я особенно горжусь этим модулем. Вроде ничего особенного, поиск по текстовому полю с подсветкой. Но давайте вникнем в детали.

Среди компонентов Win32 есть два компонента редактирования текста Edit Control (в Делфи - TMemo), и Rich Edit (в Делфи - TRichEdit). Первый работает с простыми текстовыми файлами без форматирования, второй - с файлами RTF. Если возникает задача выделить фоновым цветом часть текста в поле редактирования, возникает соблазн воспользоваться TRichEdit. Но это грязный метод, так как придётся бороться с паразитным форматированием, всеми этими отступами, параграфами и междустрочными расстояниями, которые будут попадать из буфера обмена, а потом невидимо жить в тексте, внезапно проявляя себя неожиданными артефактами.

Мы пойдём своим путём. Доработаем обычный TMemo, переопределив его метод OnPaint (да, да, наследование и полиморфизм). А что, если у компонента TMemo нет метода OnPaint? Напишем свой! Итак, нам понадобятся: обработчик сообщения WM_PAINT, GetDC для получения контекста рисования, EM_POSFROMCHAR для определения экранных координат нужного символа, EM_GETRECT и SelectClipRgn для ограничения области рисования (без этого на границе компонента будет появляться цветной мусор), SetBkColor для установки фонового цвета, TextOutA для вывода строки поверх системной.

Вуаля! Мы написали свой компонент, которого раньше не существовало в природе. Можете искать по форумам и книжкам, такого просто нет. Мы первые.



Результат можно скачать здесь:
https://github.com/podoroges/pplib/blob/master/ppSearchMemo.h
https://github.com/podoroges/pplib/blob/master/ppSearchMemo.cpp

Должен сказать, что из моих знакомых только Макс Шепелев умеет опускаться на уровень оконных сообщений Windows API. Именно он научил меня нырять в пучины MSDN, и возвращаться с магнитиками. Если кто-нибудь вдруг знает его ФБ, стукнитесь мне в личку.
Отдельное "Ку!" заказчику - Максу Богатову за нестандартные задачки :)

No comments: