Делание прямоугольного выбора в RichTextBox с разверткой Alt-Left-Mouse?

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

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

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

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

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

5
задан Harold Bamford 25 May 2012 в 14:53
поделиться

1 ответ

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. Все и вся, этот ответ вряд ли получит столько же ответов, сколько вопрос.

4
ответ дан 15 December 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: