2010-10-15 27 views
5

Formda Zengin Metin Kutusu denetimi olan bir Windows Formum var. Yapmak istediğim, her satırın yalnızca 32 karakterden oluşan metni kabul etmesidir. 32 karakterden sonra, metnin bir sonraki satıra akmasını istiyorum (herhangi bir satırbaşı iadesi eklemek istemiyorum). WordWrap özelliği neredeyse bunu yapar; metin girilen tüm metinleri metindeki son boşluğa taşır ve hepsini taşır. Sadece 32 karakterden sonra metni düzgün bir şekilde sarmak istiyorum. Bunu nasıl yapabilirim? C# kullanıyorum.Zengin bir metin kutusuna Metin Sarma, ancak sarma sözcüğü

cevap

4

Tamam, bunu yapmanın bir yolunu buldum (çok fazla googling ve Windows API referansından sonra) ve bunu anlamak için başka birinin olması durumunda bir çözüm yolluyorum. Bunun için temiz bir .NET çözümü yoktur, ancak neyse ki, Windows API, sözcük kaydırma işleminde çağrılan varsayılan yordamı geçersiz kılmanıza izin verir. Sonra yeni işlevi oluşturmak

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

    event EditWordBreakProc myCallBackEvent; 

:

const uint EM_SETWORDBREAKPROC = 0x00D0; 

Sonra bir temsilci ve etkinlik oluşturmak:

[DllImport("user32.dll")] 

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

Sonra bu sabit tanımlamak gerekir: Birincisi aşağıdaki DLL ithalat gerekir (Bu durumda, herhangi bir şey yapmasını istemiyorum) kelime sargısını işlemek için:

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

    { 

     return 0; 

    } 

Son olarak, formun Gösterilen olay:

 myCallBackEvent = new EditWordBreakProc(myCallBack); 

     IntPtr ptr_func = Marshal.GetFunctionPointerForDelegate(myCallBackEvent); 

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

Zengin metin kutusundaki metin için yalnızca bir (bir) sabit genişlikli font kullanıyorsanız, MeasureString, 32 karakter için gereken genişliği saymak ve zengin metin kutusu genişliğini buna göre ayarlamak için kullanabilirsiniz. Thats 32 karakter içinde sarmalı.

+0

Sabit genişlikli bir font olan Courier New yazı tipini kullanıyorum. Ancak önerilerinizi kullanmak, WordWrap özelliğini false olarak ayarlarsa, metin kutum, istemediğim yatay olarak kaydırır. Eğer WordWrap öğesini true olarak ayarlarsam, o zaman 32 karaktere sarılır, ancak istemediğim tüm sözcükleri sarar. – Icemanind

0

Bu sorunla kendimi arıyordum ve Bunu aşmanın gerçekten çok kolay bir yol bulduk. TextBox veya RichTextBox denetiminizdeki Key_Down Etkinliğine küçük bir kod parçası eklemeniz gerekir.

Hem Word Wrap hem de Multiline özelliklerinin hala true olarak ayarlandığından emin olun, daha sonra KeyCode.Return & Keycode.Enter. Aşağıda gibi

: -

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

     } 

burada true ele değerini sen ayarlanması, biz Anahtar Basın olayı ele alınmıştır mesajı geri gönderir ve hiçbir şey olmuyor. Metin Denetimi, Word Wrap kullanmaya devam eder ve satır başı geri kalanını engeller.

Bu yardımcı olur umarım.

+0

Sanırım fikir, Word Wrap kullanmamaktı. Bir kelime 32 karakter çizgisi sınırını geçerse OP'nin kelimelerle ortada sarılmak istediğini düşünüyorum. – Ben