2010-10-15 16 views
5

Mam formularz Windows z formantem Rich Textbox w formularzu. Chcemy zrobić to tak, aby każda linia akceptowała tylko 32 znaki tekstu. Po 32 znakach chcę, aby tekst przepłynął do następnej linii (NIE chcę wstawiać żadnych powrotów karetki). Właściwość WordWrap prawie to robi, z tym wyjątkiem, że przesuwa cały wprowadzony tekst, aż do ostatniego miejsca w tekście i przenosi je wszystkie. Chcę tylko starannie zawijać tekst tuż po 32 znakach. Jak mogę to zrobić? Używam C#.Zawijanie tekstu w sformatowanym polu tekstowym, ale nie zawijanie go w słowo

Odpowiedz

4

Ok, znalazłem sposób na zrobienie tego (po wielu testach Google i Windows API) i publikuję tutaj rozwiązanie na wypadek, gdyby ktoś inny kiedykolwiek to wymyślił. Nie ma na to czystego rozwiązania .NET, ale na szczęście interfejs API systemu Windows pozwala zastąpić domyślną procedurę, która jest wywoływana podczas obsługi zawijania tekstu. Najpierw trzeba importować następujące DLL:

[DllImport("user32.dll")] 

    extern static IntPtr SendMessage(IntPtr hwnd, uint message, IntPtr wParam, IntPtr lParam); 

Następnie trzeba zdefiniować ten Constant:

const uint EM_SETWORDBREAKPROC = 0x00D0; 

następnie utworzyć delegata i zdarzenia:

delegate int EditWordBreakProc(IntPtr text, int pos_in_text, int bCharSet, int action); 

    event EditWordBreakProc myCallBackEvent; 

Następnie tworzymy nową funkcję obsłużyć zawijanie słów (które w tym przypadku nie chcę, aby cokolwiek):

 private int myCallBack(IntPtr text, int pos_in_text, int bCharSet, int action) 

    { 

     return 0; 

    } 

Wreszcie, w przedstawionym przypadku formularza:

 myCallBackEvent = new EditWordBreakProc(myCallBack); 

     IntPtr ptr_func = Marshal.GetFunctionPointerForDelegate(myCallBackEvent); 

     SendMessage(txtDataEntry.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, ptr_func); 
2

Jeśli używasz tylko (jednej) czcionki o stałej szerokości dla tekstu w polu tekstu sformatowanego, możesz użyć numeru MeasureString, aby zliczyć szerokość wymaganą dla 32 znaków, a następnie odpowiednio dostosować szerokość pola tekstowego. To powinno się owijać w ciągu 32 znaków.

+0

Używam czcionki Courier New, która jest czcionką o stałej szerokości. Jednak przy użyciu Twojej sugestii działa, jeśli ustawię właściwość WordWrap na wartość false, wówczas mój tekst przewija się poziomo, czego nie chcę. Jeśli ustawię WordWrap na true, to opakuje się na 32 znaki, jednak zawija całe ostatnie słowo, którego nie chcę. – Icemanind

0

Szukałem na ten problem i okazało się naprawdę łatwy sposób obejść ten problem. Musisz umieścić mały fragment kodu w zdarzeniu Key_Down na twoim formancie TextBox lub RichTextBox.

Upewnij się, że zarówno właściwości Zawijanie tekstu, jak i Multilinię są nadal ustawione na wartość true, a następnie po prostu sprawdź, czy naciśnięcie klawisza KeyCode.Return & Keycode.Enter.

jak poniżej: -

private void richTextBox1_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return) 
      { 
       e.Handled = true; 
      } 

     } 

Ustawianie obsługiwane wartość, którą tu true, wysyła komunikat, że mamy do czynienia z wciśnięcie klawisza razie nic się nie dzieje. Sterowanie tekstem nadal używa zawijania tekstu i blokuje powrót karetki.

Mam nadzieję, że to pomoże.

+0

Myślę, że pomysł nie polegał na używaniu Zawijania słów. Myślę, że OP chce zawinąć w połowie poprzez słowa, jeśli słowo przekracza limit linii 32 znaków. – Ben

Powiązane problemy