Underscore acts as a separator C# RTF Box

后端 未结 1 1059
-上瘾入骨i
-上瘾入骨i 2021-01-17 02:06

I am working on a Winforms application and using Find on the RichTextBox control to find particular keywords to style.

For some reason, despite specifying the WholeW

1条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-01-17 03:12

    You can, although it's a bit hairy. You need to specify a custom word breaking procedure for your rich text box, and you want to override certain cases and otherwise use the default handler. In C++, it's pretty straightforward; in C#, not so much. This question describes the setup; I've updated it to save the old proc for handling the other cases.

    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);
            }
        }
    }
    

    0 讨论(0)
提交回复
热议问题