2017-03-06 23 views
0

我有一個MemoEdit字段,並且當用戶插入每行比我的MemoEdit字段更多的字符的文本時,組件行爲有問題。 只要達到一條線的最大長度,該組件就會斷開該線並在下一行中繼續。如何正確保存我的MemoEdit的格式

但是,這些換行符只是「可視的」,這意味着每個換行符都不會添加換行符。 由於這些缺少換行符,即使正確格式化的文本在保存後也會失效,因爲正在格式化它們的用戶無法查看是否有回車換行符或只是「可視」換行符。 有沒有一種方法可以根據備忘錄編輯字段的大小確定字符串中換行符即將出現的確切索引? 特別是當我嘗試考慮單個字符間距時,似乎很難找到一種通用方法。

回答

0

目前最簡單的解決方案是禁用單詞換行。您可以通過設置memoEdit.Properties.WordWrap = false來實現此目的。這將導致您的編輯器向右流動,而不是進行視覺斷線。因此,您的用戶可以在需要時添加換行手冊。

獲取文本應該被破壞的索引似乎很難。我想出了這樣的事情:

private void memoEdit1_TextChanged(object sender, EventArgs e) 
{ 
    using (Graphics gr = Graphics.FromHwnd(IntPtr.Zero)) 
    { 
     //Get the actual line 
     string text = memoEdit1.Lines[memoEdit1.Lines.Length - 1]; 

     //Calculate the size of the string 
     SizeF size = gr.MeasureString(text, memoEdit1.Font); 

     //Check if the string is as big as the memoedit 
     //Notice the 50 which is constant for the width of the vertical scrollbar 
     //so far you use one. You may need to fit this to your needs. 
     if (size.Width >= memoEdit1.Size.Width - 50) 
     { 
     int index = memoEdit1.Text.Length - 1; 
     } 
    } 
} 

這只是一個想法,你也許需要修改這個在項目運行的正確。我對vb.net不熟悉,所以這是C#,但應該可以採用。

希望這對你有所幫助。

0

在Win32 API中有EM_FMTLINES消息。如果您將此消息發送到TextBox控件,則其Text屬性將包含軟換行符。軟分行符是CrCrLf個字符的組合,用於標記由於換行而導致分行損壞的地方。
這裏是例如簡單的擴展模塊的:

Module TextBoxExtension 

    Private Const EM_FMTLINES As UInteger = &HC8 

    <DllImport("user32.dll", CharSet:=CharSet.Auto)> 
    Private Function SendMessage(hWnd As IntPtr, Msg As UInteger, wParam As Integer, lParam As IntPtr) As IntPtr 
    End Function 

    <Extension()> 
    Public Function GetWrappedText(ByVal textBox As TextBox) As String 

     Dim handle = textBox.Handle 

     SendMessage(handle, EM_FMTLINES, 1, IntPtr.Zero) 

     GetWrappedText = textBox.Text 

     SendMessage(handle, EM_FMTLINES, 0, IntPtr.Zero) 

    End Function 

End Module 

MemoEdit類是框保持TextBoxMaskBox類的實例。 TextBoxMaskBox類繼承自System.Windows.Forms.TextBox類。你可以從MemoEdit.MaskBox屬性中獲得。

Dim text = MemoEdit1.MaskBox.GetWrappedText 

現在你可以通過使用String.Split方法得到線:

Dim lines = text.Split({vbCr & vbCrLf, vbCrLf, vbLf}, StringSplitOptions.None) 
相關問題