2010-06-03 1 views
5

Существует довольно много приложений, которые позволяют вам выбирать прямоугольник или прямоугольник текста, подметая мышью при нажатии клавиши Alt. Например, Visual Studio 2010 делает это в редакторе кода. Emacs делает это. Winword делает это. Мы все это видели. Кажется, что для кодирования этого поведения должен быть стандартный шаблон, но я не могу его найти.Создание прямоугольного выделения в RichTextBox с помощью мыши Alt-Left-Mouse?

Я подозреваю, что я не погуглить с правильными ключевыми словами, как все я получаю ложные удары по прямоугольнику, Alt-Left, подметать, отбор и т.д.

Я уверен, что я могу закодировать его, но будет означать отключение обычного кода выбора, используемого, скажем, RichTextBox. И это звучит уродливо, склонно к ошибкам и, вероятно, больше работы, чем того стоит.

У кого-нибудь есть предложение (будь красиво! :-)), как это сделать или пример того, как это делается?

UPDATE: Я только что нашел эту статью на проекте кодекса, которые могут применяться: Column based selection

+0

У меня нет ответа, но я просто хотел сказать спасибо за отзыв, никогда не замечал, что вы можете это сделать до этого ........ –

+0

Да, это редко рекламируется, но когда вам это нужно, больше ничего не будет делать. –

ответ

4

RichTextBox часто ошибочно принимают за редактором. Это технически возможно, вам понадобится много кода. Первый заказ - выбрать шрифт с фиксированным шагом, например Courier.

Основная проблема заключается в том, что вы не можете использовать функцию выбора, она всегда охватывает линии. Вы должны подделать его, возможно, используя свойство SelectionBackColor. Внесите события MouseDown и MouseMove, проверьте свойство Control.Modifiers, чтобы увидеть, выключен ли ключ ALT. Используйте GetCharIndexFromPosition, чтобы узнать, что выбрано. В событии перемещения проведите по столбцам и строкам, которые были удалены/выбраны, с использованием свойств SelectionStart, SelectionLength и SelectionBackColor для окраски символов.

Это будет мерцать, как дешевый мотель. P/Invoke SendMessage(), чтобы отправить сообщение WM_SETREDRAW до и после, чтобы избежать этого.

Выполнение чего-то с выбором сложнее. Вам понадобится подкласс класса RTB, чтобы вы могли переопределить WndProc() и обнаружить сообщения WM_COPY, WM_CUT, WM_PASTE. Другие случайные проблемы - это автоматическая прокрутка, когда мышь приближается к верхней или нижней части элемента управления и не выбирает, когда выполняется другой выбор.

Или вы можете использовать настоящий редактор, такой как ScintillaNET. В общем, этот ответ вряд ли получит столько же вопросов, сколько вопрос.

+0

Ow! Это больно глазам! :-) Я боялся, что это будет больше работы, чем стоило. Приложение, которое у меня есть, больше похоже на инструмент ведения журнала, чем редактор, и я думал, что добавлю прямоугольный отбор по общим принципам. Мне придется пересмотреть сейчас. Спасибо, Ханс. –

+0

Хорошо, я спас вас около 8 часов работы. Не полезно? –

+0

Да, очень полезно! –

Смежные вопросы