下划线作为分隔符C#RTF箱 [英] Underscore acts as a separator C# RTF Box
问题描述
我工作的一个WinForms应用程序,并使用查找RichTextBox控件来找到特定关键字的风格。
I am working on a Winforms application and using Find on the RichTextBox control to find particular keywords to style.
由于某些原因,尽管指定WholeWord标志, 。查找好像对待一个词在它下划线作为2个独立的话(及款式匹配的一半)。
For some reason, despite specifying the WholeWord flag, the Find seems to treat a word with an underscore in it as 2 separate words (and styles the matching half).
函数调用:
richTextBox1.Find("Keyword", RichTextBoxFinds.MatchCase | RichTextBoxFinds.WholeWord);
这是怎么回事?我可以重写它/某种程度上解决这个问题?
Why is this happening? Can I override it/fix it somehow?
推荐答案
可以,虽然这是一个有点毛。你需要指定一个定义单词打破程序为您丰富的文本框,并要覆盖某些情况下,否则使用默认的处理程序。在C ++中,这是非常简单的;在C#中,没有这么多。 这个问题介绍了设置;我已经更新它保存旧PROC用于处理其他案件。
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);
}
}
}
这篇关于下划线作为分隔符C#RTF箱的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!