Ho un Windows Form con un controllo Rich Textbox nel modulo. Quello che voglio fare è fare in modo che ogni riga accetti solo 32 caratteri di testo. Dopo 32 caratteri, voglio che il testo passi alla riga successiva (NON voglio inserire alcun ritorno a capo). La proprietà WordWrap lo fa quasi, tranne che sposta tutto il testo inserito, fino all'ultimo spazio nel testo e sposta tutto. Voglio solo avvolgere perfettamente il testo subito dopo 32 caratteri. Come posso fare questo? Sto usando C#.Rimozione del testo in una casella di testo complessa, ma non a capo automatico
risposta
Ok, ho trovato un modo per farlo (dopo un sacco di googling e riferimenti API di Windows) e sto postando una soluzione qui nel caso in cui qualcun altro abbia mai bisogno di capirlo. Non esiste una soluzione .NET pulita a questo, ma fortunatamente, l'API di Windows consente di ignorare la procedura predefinita che viene chiamata quando si gestisce il ritorno a capo automatico. In primo luogo è necessario importare i seguenti DLL:
[DllImport("user32.dll")]
extern static IntPtr SendMessage(IntPtr hwnd, uint message, IntPtr wParam, IntPtr lParam);
allora avete bisogno di definire questa costante:
const uint EM_SETWORDBREAKPROC = 0x00D0;
quindi creare un delegato e evento:
delegate int EditWordBreakProc(IntPtr text, int pos_in_text, int bCharSet, int action);
event EditWordBreakProc myCallBackEvent;
Quindi creare la nostra nuova funzione per gestire il ritorno a capo automatico (che in questo caso non voglio che faccia nulla):
private int myCallBack(IntPtr text, int pos_in_text, int bCharSet, int action)
{
return 0;
}
Infine, nel caso indicato di modulo:
myCallBackEvent = new EditWordBreakProc(myCallBack);
IntPtr ptr_func = Marshal.GetFunctionPointerForDelegate(myCallBackEvent);
SendMessage(txtDataEntry.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, ptr_func);
Se si utilizza solo un carattere a larghezza fissa per il testo all'interno della casella di testo RTF, è possibile utilizzare MeasureString per contare la larghezza necessaria per 32 caratteri e quindi regolare di conseguenza la larghezza della casella di testo avanzata. Quello dovrebbe fare la confezione entro 32 caratteri.
Ho cercato in questo problema me stesso e ho trovato un modo molto semplice per ottenere intorno a questo. È necessario inserire una piccola porzione di codice nell'evento Key_Down sul controllo TextBox o RichTextBox.
Assicurarsi che sia le proprietà Word Wrap e Multiline siano ancora impostate su true, quindi, è sufficiente controllare la Key Press di KeyCode.Return & Keycode.Enter.
come di seguito: -
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
{
e.Handled = true;
}
}
Impostando il valore trattati qui su true, restituisce il messaggio che abbiamo affrontato con la stampa evento chiave, e non succede nulla. Il controllo del testo continua a utilizzare a capo automatico e blocca il ritorno a capo.
Spero che questo aiuti.
Penso che l'idea non fosse l'uso di Word Wrap. Penso che l'OP voglia avvolgere a metà tra le parole se una parola supera il limite di 32 caratteri. – Ben
- 1. Casella di testo con ritorno a capo in matplotlib?
- 2. Come disabilitare il ritorno a capo del testo nel controllo della casella di testo?
- 3. Testo a capo in PIL
- 4. Testo a capo automatico in Argox OS214 - PPLA
- 5. Testo evidenziato automatico in un controllo casella di testo
- 6. Testo a capo all'interno dell'elemento
- 7. C# Completamento automatico casella di testo: limite a ~ 50 suggerimenti
- 8. Come aggiungere testo in una casella di testo multilinea?
- 9. DrawText Android incluso il testo a capo
- 10. Testo a capo nel tag P
- 11. jQuery testo) chiamata (conserva a capo in Firefox, ma non in IE
- 12. Ottenere il testo selezionato in una casella di testo
- 13. Deseleziona il testo in una casella di testo
- 14. Modifica del colore di sfondo e del colore del testo in una casella di testo
- 15. A capo automatico in Gvim
- 16. Casella di testo non modificabile in wxPython
- 17. Come inserire testo da una casella di testo in selenio
- 18. Testo a capo all'interno di un elemento div non funziona
- 19. Rimozione del testo all'interno di Parens, ma non in Parl in Perl
- 20. Word-Wrap Android Testo del testo EditText
- 21. Algoritmi a capo automatico per il giapponese
- 22. WPF: Casella di testo con completamento automatico, ... nuovamente
- 23. Casella di completamento automatico Bug di testo selezionato
- 24. javascript/html casella di testo con completamento automatico
- 25. Casella di testo multilinea con scorrimento verticale automatico
- 26. Android: testo a scorrimento automatico in TextView
- 27. VisualForce: converti ritorni a capo in intervalli di testo html in un campo di testo lungo
- 28. Scansione codice a barre in una casella di testo specifica
- 29. WinForms: completamento automatico nella casella di testo multilinea
- 30. itext testo multilinea nella casella di delimitazione
Sto utilizzando il carattere Courier New, che è un carattere a larghezza fissa. L'utilizzo del tuo suggerimento funziona, tuttavia, se imposto la proprietà WordWrap su false, la mia casella di testo scorre in orizzontale, cosa che non desidero. Se imposto WordWrap su true, viene eseguito il wrapping con 32 caratteri, tuttavia esso avvolge l'ultima parola in basso, che non desidero. – Icemanind