[.Net] Альтернативы RichTextBox есть?

bleyman

RichTextBox (из 2.0 фреймворка, по крайней мере) как-то меня уже немножко задолбал.
Например, если хочется использовать тупо для вывода разноцветного текста как бы в лог, мгновенно возникает куча проблем: после дописывания очередной строчки в конец нужно его проскроллить так, чтобы она была видна, если использовать его личный метод ScrollToCaret, всё ужасным образом дёргается. Приходится послылать WM_SCROLL через апи. Когда выясняется, что текста уже как бы слишком много, удаление верхних строчек производится вообще через жопу, потому что маппинг "позиция в тексте - номер строки" скрыт. Не говоря уж о том, что было бы весьма приятно удалить ровно одну строчку, но тогда он тормозит совершенно нечеловечески, поскольку на самом деле у него внутри просто буфер с RTF, при удалении строчки из начала он двигает весь буфер, плюс, подозреваю, ещё ему приходится искать релевантные куски в RTF и дописывать туда всякое (если у меня посреди удаляемой строчки меняется цвет). И всё равно всё дёргается и тормозит, потому что никакого SuspendUpdate/ResumeUpdate у него нет.
О реализации более сложного поведения, вроде простановки красного восклицательного знака в конце строчек, уходящих за правый марджин (если выключен вордврап) даже мечтать не приходится, сразу понятно, что это потребует кучи усилий и всё равно будет глючить и тормозить.
Когда я думаю, что потом мне нужно было бы с использованием этого убожества сделать ещё и простенький редактор, но с автоподсветкой и, возможно, каким-нибудь автокомплитом, мне становится совсем плохо.
Происходит всё от того, что RichTextBox является кривым враппером для винапишного RichEdit'a, который и сам в общем-то для другого предназначен, для того, чтобы писать на нём вордпад. То есть имеется крайне жёсткий и ограниченный интерфейс к штуке, обладающей кучей неуправляемой функциональности. Ну, реально, мне даётся возможность добавить на формочку конторолов для выставления цвета/шрифта селекшена, всё остальное он делает сам и мне к этому доступа не даёт.
В связи с этим возникает вопрос: существуют ли в природе нормальные альтернативы?
Хочется чего-то предоставляющего _нормальный_ интерфейс, с быстрым и удобным получением/добавлением/удалением строчек, нормальным изменением цвета (а не через это ужасное "запомнить позицию и цвет селекшена, выставить селекшен туда-то, SetSelectionColor, восстановить позицию и цвет селекшена" доступной информацией о том, что и где только что сделал юзер, возможностью вклиниваться в разные места и так далее. Крайне желательно, чтобы оно использовало винапи только для отрисовки, всё остальное делало само (иначе неизбежно получится так же криво). Всякой фигни вроде разных шрифтов разных размеров и вставляемых картинок лучше не надо. И, конечно, оно должно быть достаточно свободным (то есть не GPL и не платным).
Кто-нибудь видел что-нибудь такое? Ну, я не знаю, может в каком-нибудь свободном IDE или ещё где? Я б даже какое-нибудь GTK# мог бы использовать, если бы был уверен, что там всё лучше и что оно не будет выглядеть совсем уж отвратительно.

Dasar

HtmlBrowser?

aleks058

На РСДН на такие вопросы обычно предлагают попробовать "Scintilla" (я ставил плагин а-ля колорер к lister-у для Тотала, который 1) по заверению разрабов её использует и 2) тормозит безбожно).
Если не найдешь ничего хорошего, можешь написать резюм сюда, устроиться на работу и налабать нормальный редактор твоей мечты вместе с Microsoft guys.

SPARTAK3959

SharpDevelop вроде как обладает редактором текста с подсветкой синтаксиса.

klyv

Например, если хочется использовать тупо для вывода разноцветного текста как бы в лог, ... Когда выясняется, что текста уже как бы слишком много, удаление верхних строчек производится вообще через жопу, потому что маппинг "позиция в тексте - номер строки" скрыт. Не говоря уж о том, что было бы весьма приятно удалить ровно одну строчку, ...
О реализации более сложного поведения, вроде простановки красного восклицательного знака в конце строчек, уходящих за правый марджин (если выключен вордврап) ....
Конечно, не знаю, куда потом это надо будет развивать, но если это - просто лог, да ещё и лог из строчек, то почему бы не использовать что-то типа ListBox в качестве основы?..
И дорабатывать напильником мало что надо будет, и функциональность, как я понимаю, достаточна для такой задачи...

bleyman

Спасибо за ответы.
- ну, что-то у меня есть подозрение, что браузер ещё более тормозной и неудобный, хотя вроде и даёт доступ к DOM. Проблема же не в том, чтобы просто вывести текст, а чтобы полноценно работать с ним программно.
Добавлю ещё, что меня не устраивает: если мне, например, хочется обрабатывать клавиатурные эвенты так, как я хочу (сделать в текстэдите специальное действие по ctrl+Enter, например мне нужно наследоваться и развлекаться чорной магией. Причём есть подозрение, что чорная магия будет включать ещё и переписывание WindowProc. Ну, это совсем неприкольно, мне бы хотелось работать только с шарпом.
, посмотрел, что-то у них шарпобиндинг совсем экспериментальный какой-то.
, да, я пробовал так делать, но это тоже ужас-ужас, чтобы сделать подсветку нужно извращаться, чтобы сделать wordwrap нужно извращаться невообразимо.
Не знаю, видимо, нужно самому писать =)

timefim

А впфешный не смотрел?

vall

а не лучше смотреть не на текстовые редакторы а на эмуляторы консоли?
приделать к проге telnet сервер и цепляться чем угодно, а там уж vt100 цвета и прочие красивости.

kokoc88

Конечно, в .NET RichEdit встроен очень плохо, тебе в любом случае придётся делать вызовы в API. Но с точки зрения API это очень хороший текстовый редактор. Не знаю, почему он у тебя тормозит при удалении строк, я работал с текстами размером более 4МБ без проблем.
На самом деле с RichEdit нужно работать не через посылку WIN32 сообщений, а через ITextDocument. Можно почитать про Text Objet Model и Windowless Rich Edit. Эти технологии предоставляют более удобные методы для работы с Rich Edit, кроме того в .NET приемлемый interop c COM.

bleyman

Ух ты!
Не подозревал даже о наличии таких глубин, спасибо.
Хотя, кажется, для моих целей изобретение собственного колеса будет удобнее.
Оставить комментарий
Имя или ник:
Комментарий: