你可以,虽然有点毛茸茸的。您需要指定一个自定义断词程序 http://msdn.microsoft.com/en-us/library/windows/desktop/hh270412%28v=VS.85%29.aspx对于您的富文本框,并且您想要覆盖某些情况并使用默认处理程序。在 C++ 中,这非常简单;在 C# 中,没有那么多。这个问题 https://stackoverflow.com/questions/6359774/suppress-line-break-in-a-richtextbox-at-certain-positions描述设置;我已经更新了它以保存旧的过程来处理其他情况。
namespace q6359774
{
class MyRichTextBox : RichTextBox
{
const int EM_SETWORDBREAKPROC = 0x00D0;
const int EM_GETWORDBREAKPROC = 0x00D1;
delegate int EditWordBreakProc(string lpch, int ichCurrent, int cch, int code);
EditWordBreakProc oldEditWordBreakProc;
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
this.Text = "abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyz";
if (!this.DesignMode)
{
IntPtr oldproc;
oldproc = SendMessage(this.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, Marshal.GetFunctionPointerForDelegate(new EditWordBreakProc(MyEditWordBreakProc)));
oldEditWordBreakProc = Marshal.GetDelegateForFunctionPointer(oldproc, typeof(EditWordBreakProc));
}
}
[DllImport("User32.DLL")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
int MyEditWordBreakProc(string lpch, int ichCurrent, int cch, int code)
{
const int WB_ISDELIMITER = 2;
const int WB_CLASSIFY = 3;
if (code == WB_ISDELIMITER)
{
if (lpch.Length == 0 || lpch == null) return 0;
char ch = lpch[ichCurrent];
if (ch == '_')
{
return 0;
}
else return oldEditWordBreakProc(lpch, ichCurrent, cch, code);
}
else if (code == WB_CLASSIFY)
{
if (lpch.Length == 0 || lpch == null) return 0;
char ch = lpch[ichCurrent];
var vResult = Char.GetUnicodeCategory(ch);
return (int)vResult;
}
else return oldEditWordBreakProc(lpch, ichCurrent, cch, code);
}
}
}