2010-10-15 10 views
5

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

4

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); 
2

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.

+0

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

0

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.

+0

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

Problemi correlati