2010-10-15 128 views
5

我有一個Windows窗體與窗體上的格式文本框控件。我想要做的是讓每行只接受32個字符的文本。在32個字符後,我希望文本流到下一行(我不想插入任何回車符)。 WordWrap屬性幾乎做到了這一點,除了它將所有輸入的文本移動到文本中的最後一個空格並將其全部移動。我只想在32個字符後整齊地包裝文本。我怎樣才能做到這一點?我正在使用C#。將連續文本中豐富的文本,但不換行它

回答

4

好吧,我已經找到一種方法來做到這一點(很多谷歌搜索和Windows API參考之後),我如果任何人在這裏張貼的解決方案永遠需要想出解決辦法。有沒有乾淨的.NET解決方案,但幸運的是,Windows API允許您覆蓋處理文字換行時調用的默認過程。首先,你需要導入以下DLL:

[DllImport("user32.dll")] 

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

然後,你需要定義這個常量:

const uint EM_SETWORDBREAKPROC = 0x00D0; 

然後創建一個委託和事件:

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

    event EditWordBreakProc myCallBackEvent; 

然後創建我們的新功能處理文字換行(在這種情況下,我不希望它做任何事情):

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

    { 

     return 0; 

    } 

最後,在窗體的事件所示:

 myCallBackEvent = new EditWordBreakProc(myCallBack); 

     IntPtr ptr_func = Marshal.GetFunctionPointerForDelegate(myCallBackEvent); 

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

如果您在富文本框中僅使用固定寬度的字體作爲文本,則可以使用MeasureString來計算32個字符所需的寬度,然後相應地調整富文本框寬度。這應該包裝在32個字符之內。

+0

我使用Courier New字體,這是一個固定寬度的字體。然而,使用你的建議有點奏效,如果我將WordWrap屬性設置爲false,那麼我的文本框水平滾動,這是我不想要的。如果我將WordWrap設置爲true,那麼它將包含32個字符,但是它包裹了整個最後一個單詞,這是我不想要的。 – Icemanind 2010-10-15 20:46:02

0

我一直在尋找到這個問題,我自己並發現一個非常簡單的方法來解決這個問題。您需要在TextBox或RichTextBox控件的Key_Down事件中放置一小段代碼。

確保Word Wrap和Multiline屬性都設置爲true,然後,您只需檢查KeyCode的按鍵。返回& Keycode.Enter。

象下面這樣: -

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

     } 

這裏真正設置你的處理值,發回,我們處理的主要新聞事件的消息,並沒有任何反應。文本控件繼續使用Word Wrap並阻止回車。

希望這會有所幫助。

+0

我認爲這個想法不是使用Word Wrap。我認爲如果一個單詞超過了32個字符的限制,那麼OP想要在單詞中間換行。 – Ben 2015-03-13 14:30:33