Делать прямоугольный выбор в RichTextBox с Alt-Left-Mouse Sweep? - PullRequest
5 голосов
/ 03 июня 2010

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

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

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

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

ОБНОВЛЕНИЕ: я только что нашел эту статью о проекте кода, которая может применяться: Выбор на основе столбцов

1 Ответ

4 голосов
/ 04 июня 2010

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. В общем и целом, этот ответ вряд ли вызовет столько же голосов, сколько и вопрос.

...