在特定位置抑制 RichTextBox 中的换行符

Eik*_*iko 4 .net c# rtf line-breaks richtextbox

我需要在 RichTextBox 中抑制一些换行符。

例如,考虑d6+. 6和之间不能有换行符+。基本上我正在寻找类似<nobr>HTML 的东西。

到目前为止,我一直在插入 \u+FEFF 等(在某些机器上工作,但有些显示垂直线,尽管 Windows 标准字体可能是字体问题)。我还尝试直接操作 rtf,即在box.rtf = ...其中放一些\zwnbo,但我似乎从来没有做对。

非常感谢帮助。

Mig*_*elo 5

是的,您可以将所有 RichText API 与 RichTextBox 控件一起使用。

您可能有兴趣查看以下网站:

http://www.pinvoke.net/default.aspx/user32.sendmessage - 如何使用 p/invoke 向 windows 发送消息。

您可以使用 的Handle属性RichTextBox来获取该控件的窗口句柄,然后向其发送消息

还要查看 Microsoft SDK 附带的这些包含文件,它们不会直接在 C# 中使用,但这些文件包含您可能必须使用的所有常量,例如WB_ISDELIMITERWB_CLASSIFY和其他。

  • 用户名
  • 编辑器.h

在以下示例中,我演示了如何使用提供的 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 窗体中,然后运行。

调整窗口大小,看看这是否是您想要做的!

你将不得不寻找词的界限......我还没有设法让它起作用。