Ice*_*ind 5 .net c# richtextbox word-wrap winforms
我在窗体上有一个带有Rich Textbox控件的Windows窗体.我想要做的是使每行只接受32个字符的文本.在32个字符之后,我希望文本流到下一行(我不想插入任何回车符).WordWrap属性几乎可以执行此操作,除了它将所有输入的文本移动到文本中的最后一个空格并将其全部移动.我只想在32个字符后整齐地包裹文本.我怎样才能做到这一点?我正在使用C#.
好吧,我已经找到了一种方法来做到这一点(经过大量谷歌搜索和 Windows API 参考),我在这里发布了一个解决方案,以防其他人需要解决这个问题。对此没有干净的 .NET 解决方案,但幸运的是,Windows API 允许您覆盖处理自动换行时调用的默认过程。首先需要导入以下DLL:
[DllImport("user32.dll")]
extern static IntPtr SendMessage(IntPtr hwnd, uint message, IntPtr wParam, IntPtr lParam);
Run Code Online (Sandbox Code Playgroud)
然后你需要定义这个常量:
const uint EM_SETWORDBREAKPROC = 0x00D0;
Run Code Online (Sandbox Code Playgroud)
然后创建委托和事件:
delegate int EditWordBreakProc(IntPtr text, int pos_in_text, int bCharSet, int action);
event EditWordBreakProc myCallBackEvent;
Run Code Online (Sandbox Code Playgroud)
然后创建我们的新函数来处理自动换行(在本例中我不希望它执行任何操作):
private int myCallBack(IntPtr text, int pos_in_text, int bCharSet, int action)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后,在表单的 Shown 事件中:
myCallBackEvent = new EditWordBreakProc(myCallBack);
IntPtr ptr_func = Marshal.GetFunctionPointerForDelegate(myCallBackEvent);
SendMessage(txtDataEntry.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, ptr_func);
Run Code Online (Sandbox Code Playgroud)