2010-06-03 3 views
5

Esistono diverse applicazioni che consentono di selezionare una casella o un rettangolo di testo scorrendo con il mouse mentre si preme il tasto Alt. Visual Studio 2010 fa questo nell'editor di codice, ad esempio. Emacs lo fa. Winword lo fa. L'abbiamo visto tutti. Sembra che ci debba essere un modello standard da seguire per codificare questo comportamento ma non riesco a trovarlo.Creazione di una selezione rettangolare in un oggetto RichTextBox con sweep Alt-Sinistra-Mouse?

Ho il sospetto che io non sono Googling con le parole chiave giuste come tutto quello che sto ottenendo sono falsi visite per rettangolo, Alt-Sinistra, spazzare, selezione, ecc

Sono sicuro che posso codice in su, ma significherebbe disabilitare il normale codice di selezione utilizzato, ad esempio, in RichTextBox. E questo suona brutto, incline all'errore e probabilmente più lavoro di quello che vale.

Qualcuno ha un suggerimento (sii gentile! :-)) su come fare questo o un esempio di come è fatto?

UPDATE: Ho appena trovato questo articolo sul codice del progetto che potrebbero essere applicate: Column based selection

+0

Non ho una risposta ma volevo solo dire grazie per il suggerimento, non ho mai notato che potevi farlo prima ....... –

+0

Sì, è pubblicizzato raramente ma quando ne hai bisogno, nient'altro fare. –

risposta

4

RichTextBox viene spesso scambiato per un editore. È tecnicamente possibile, avrai bisogno di molto codice. Il primo ordine del giorno è selezionare un carattere a passo fisso, come Courier.

Il problema principale è che non è possibile utilizzare la funzione di selezione, si estende sempre su linee. Dovrai fingere, possibile usando la proprietà SelectionBackColor. Implementare gli eventi MouseDown e MouseMove, controllare la proprietà Control.Modifiers per vedere se il tasto ALT è inattivo. Usa GetCharIndexFromPosition per vedere cosa viene selezionato. Nell'evento move, eseguire il ciclo delle colonne e delle righe de/selezionate, utilizzando la proprietà SelectionStart, SelectionLength e SelectionBackColor per colorare i caratteri.

Questo guizzo come un motel economico. P/Invoke SendMessage() per inviare il messaggio WM_SETREDRAW prima e dopo per evitare questo.

Fare qualcosa con la selezione è impegnativo. Avrai bisogno di sottoclasse RTB in modo da poter eseguire l'override di WndProc() e rilevare i messaggi WM_COPY, WM_CUT, WM_PASTE. Altri problemi casuali sono lo scorrimento automatico quando il mouse si avvicina alla parte superiore o inferiore del controllo e deseleziona quando viene effettuata un'altra selezione.

Oppure è possibile utilizzare un editor reale, come ScintillaNET. Tutto sommato, è improbabile che questa risposta ottenga il maggior numero di voti come la domanda.

+0

Ow! Che mi fa male agli occhi! :-) Avevo paura che questo sarebbe stato più lavoro di quello che valeva. L'applicazione che ho è più simile a uno strumento di registrazione che a un editor e ho pensato di aggiungere una selezione rettangolare a principi generali. Dovrò riconsiderare ora. Grazie, Hans. –

+0

Bene, ti ho salvato circa 8 ore di lavoro. Non d'aiuto? –

+0

sì, molto utile! –