我有一个MemoEdit-Field,当用户插入一个每行字符数比我的MemoEdit-field多的文本时,组件的行为会出现问题。一旦达到一行的最大长度,组件就会中断该行并继续下一行。
然而,这些换行符只是“视觉的”,这意味着不会在每个换行符中添加任何类型的换行符。由于这些缺失的换行符,即使格式正确的文本在保存后也会被打乱排序,因为格式化它们的用户无法看到是否有回车换行符或只有一个“视觉”换行符。有没有一种方法可以根据Memo编辑字段的大小来确定字符串中将出现换行的确切索引?特别是当我尝试考虑单个字符间距时,似乎很难找到一种通用的方法。
发布于 2017-03-07 16:00:14
到目前为止,最简单的解决方案是禁用换行。您可以通过设置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#,但应该是可以采用的。
希望这能对你有所帮助。
发布于 2017-03-07 18:07:48
Win32接口中有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 ModuleMemoEdit类是包含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)https://stackoverflow.com/questions/42627569
复制相似问题