2010-06-03 11 views
5

Hay bastantes aplicaciones que le permiten seleccionar un cuadro o rectángulo de texto arrastrando con el mouse mientras se presiona la tecla Alt. Visual Studio 2010 hace esto en el editor de código, por ejemplo. Emacs lo hace. Winword lo hace. Todos lo hemos visto. Parece que debe haber un patrón estándar a seguir para codificar este comportamiento, pero parece que no puedo encontrarlo.Hacer una selección rectangular en un cuadro RichTextBox con barrido Alt-Izquierda-Ratón?

Sospecho que no estoy buscando en Google con las palabras clave correctas como todo lo que estoy recibiendo son falsos accesos a rectángulo, Alt-Izquierda, barrido, selección, etc.

Estoy seguro de que puedo código arriba pero significaría deshabilitar el código de selección normal utilizado en, por ejemplo, RichTextBox. Y eso suena feo, propenso a errores y probablemente más trabajo de lo que vale.

Alguien tiene una sugerencia (¡qué bueno! :-)) de cómo hacer esto o un ejemplo de cómo se hace.

ACTUALIZACIÓN: Acabo de encontrar este artículo en código del proyecto que podrían aplicar: Column based selection

+0

No tengo una respuesta, pero solo quería decir gracias por la sugerencia, nunca me había dado cuenta de que podía hacer eso antes ....... –

+0

Sí, rara vez se anuncia, pero cuando lo necesite, nada más lo hará hacer. –

Respuesta

4

RichTextBox es a menudo confundido con un editor. Es técnicamente posible, necesitarás mucho código. La primera orden del día es seleccionar una fuente de tono fijo, como Courier.

El problema principal es que no puede usar la función de selección, siempre abarca las líneas. Deberá falsificarlo, es posible utilizando la propiedad SelectionBackColor. Implemente los eventos MouseDown y MouseMove, compruebe la propiedad Control.Modifiers para ver si la tecla ALT está desactivada. Use GetCharIndexFromPosition para ver lo que se está seleccionando. En el evento mover, recorra las columnas y las filas que fueron de/seleccionadas, usando la propiedad SelectionStart, SelectionLength y SelectionBackColor para colorear los caracteres.

Esto parpadeará como un motel barato. P/Invoke SendMessage() para enviar el mensaje WM_SETREDRAW antes y después para evitar esto.

Hacer algo con la selección es un reto. Tendrá que sub-clase RTB para que pueda anular WndProc() y detectar los mensajes WM_COPY, WM_CUT, WM_PASTE. Otros problemas aleatorios son el desplazamiento automático cuando el mouse se acerca a la parte superior o inferior del control y anula la selección cuando se realiza otra selección.

O podría utilizar un editor real, como ScintillaNET. En general, es poco probable que esta respuesta obtenga tantos votaciones ascendentes como la pregunta.

+0

¡Ay! Eso lastima mis ojos! :-) Temía que esto sería más trabajo de lo que valía. La aplicación que tengo es más como una herramienta de registro que como un editor y pensé que agregaría una selección rectangular en principios generales. Tendré que reconsiderar ahora. Gracias, Hans. –

+0

Bueno, te ahorré unas 8 horas de trabajo. ¿No es útil? –

+0

sí, ¡muy útil! –

Cuestiones relacionadas