Eik*_*iko 4 .net c# rtf line-breaks richtextbox
我需要在 RichTextBox 中抑制一些换行符。
例如,考虑d6+
. 6
和之间不能有换行符+
。基本上我正在寻找类似<nobr>
HTML 的东西。
到目前为止,我一直在插入 \u+FEFF 等(在某些机器上工作,但有些显示垂直线,尽管 Windows 标准字体可能是字体问题)。我还尝试直接操作 rtf,即在box.rtf = ...
其中放一些\zwnbo
,但我似乎从来没有做对。
非常感谢帮助。
是的,您可以将所有 RichText API 与 RichTextBox 控件一起使用。
您可能有兴趣查看以下网站:
http://www.pinvoke.net/default.aspx/user32.sendmessage - 如何使用 p/invoke 向 windows 发送消息。
您可以使用 的Handle
属性RichTextBox
来获取该控件的窗口句柄,然后向其发送消息。
还要查看 Microsoft SDK 附带的这些包含文件,它们不会直接在 C# 中使用,但这些文件包含您可能必须使用的所有常量,例如WB_ISDELIMITER
、WB_CLASSIFY
和其他。
在以下示例中,我演示了如何使用提供的 API。
编辑:
这个新示例的代码标记为不安全,但它更好,因为它没有单字符串的问题,因为我可以有一个char*
参数并对其进行操作。在老样本如下这样:
这是 C# 代码,而不是 C++...要编译它,您必须转到项目选项并标记复选框以允许不安全代码运行。
右键单击项目-> 属性(Alt+Enter)-> 构建-> 常规-> 允许不安全代码(必须选中)
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace q6359774
{
class MyRichTextBox : RichTextBox
{
const int EM_SETWORDBREAKPROC = 0x00D0;
const int EM_GETWORDBREAKPROC = 0x00D1;
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
this.Text = "abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyz";
NewMethod();
}
unsafe private void NewMethod()
{
if (!this.DesignMode)
SendMessage(this.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, Marshal.GetFunctionPointerForDelegate(new EditWordBreakProc(MyEditWordBreakProc)));
}
[DllImport("User32.DLL")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
unsafe delegate int EditWordBreakProc(char* lpch, int ichCurrent, int cch, int code);
unsafe int MyEditWordBreakProc(char* lpch, int ichCurrent, int cch, int code)
{
const int WB_ISDELIMITER = 2;
const int WB_CLASSIFY = 3;
if (code == WB_ISDELIMITER)
{
char ch = *lpch;
return ch == '-' ? 0 : 1;
}
else if (code == WB_CLASSIFY)
{
char ch = *lpch;
var vResult = Char.GetUnicodeCategory(ch);
return (int)vResult;
}
else
{
var lpch2 = lpch;
// in this case, we must find the begining of a word:
for (int it = ichCurrent; it < cch; it++)
{
char ch = *lpch2;
if (it + 1 < cch && lpch2[0] == '-' && lpch2[1] != '-')
return it;
if (lpch2[0] == '\0')
return 0;
lpch2++;
}
}
return 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
旧示例代码
该示例包含一个从 RichTextBox 继承的类,并使用EM_SETWORDBREAKPROC
. 此类只会在超过 '-' 字符时准确断行。不是之前,也不是之后。
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace q6359774
{
class MyRichTextBox : RichTextBox
{
const int EM_SETWORDBREAKPROC = 0x00D0;
const int EM_GETWORDBREAKPROC = 0x00D1;
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
this.Text = "abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyz";
if (!this.DesignMode)
SendMessage(this.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, Marshal.GetFunctionPointerForDelegate(new EditWordBreakProc(MyEditWordBreakProc)));
}
[DllImport("User32.DLL")]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
delegate int EditWordBreakProc(string lpch, int ichCurrent, int cch, int code);
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];
return ch == '-' ? 0 : 1;
}
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
{
if (lpch.Length == 0 || lpch == null) return 0;
for (int it = ichCurrent; it < lpch.Length; it++)
{
char ch = lpch[it];
if (ch != '-') return it;
}
}
return 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一个草稿,所以你可能需要进一步改进它,这样你才能实现你的目标。
将控件放在 Windows 窗体中,然后运行。
调整窗口大小,看看这是否是您想要做的!
你将不得不寻找词的界限......我还没有设法让它起作用。