如何在自定义字符串中高亮我想要的子字符串

本文关键字:字符串 我想要 高亮 自定义 | 更新日期: 2023-09-27 18:13:38

我一直在做我自己的自动完成组合框和文本框。起初,我只是搜索匹配包含作为子字符串无论在文本框或组合框的。text属性。对于用户来说,这是一个非常直观的算法,所以我在表单上的小无边界列表框弹出窗口显示可能的匹配,真的不需要突出显示下面可能匹配中的子字符串。

最终,虽然我开始使用我的自动完成控件来搜索一些字符串,像这样:

Bob -- Johnson -- 21 Coconut grove -- Age 43 -- Customer ID : 21253

我想这样做,如果用户在框中输入"Bob Coconut"甚至"Bob Coco 42",则该记录将出现在下拉框中,因为在第一个情况下它包含"Bob"answers"Coconut",因为在第二个情况下它包含"Bob"answers"Coco",即使42没有。

我想通过给建议中出现的不同子字符串上色来帮助用户找出匹配和排序建议的算法。下面是用一个项目填充建议弹出列表框的代码。

private void List_DrawItem(object sender, DrawItemEventArgs e)
    {
        Color bColor = e.BackColor;
        if (e.State == DrawItemState.Selected)
        {
            e.Graphics.FillRectangle(new SolidBrush(this.PopupSelectionBackColor), e.Bounds);
            e.Graphics.DrawString(" " + this.list.Items[e.Index].ToString(), e.Font, new SolidBrush(this.PopupSelectionForeColor), e.Bounds, StringFormat.GenericTypographic);
        } 
        else
        {
            //e.DrawBackground();
            e.Graphics.FillRectangle(new SolidBrush(this.BackColor), e.Bounds);
            e.Graphics.DrawString(" " + this.list.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, StringFormat.GenericTypographic);
        }


    }

我需要弄清楚的是如何在匹配字符串中找到我的子字符串的坐标,然后将它们重新绘制为单独的颜色或运行某种图形算法,其中包含文本的矩形中作为背景颜色的所有像素都被更改。

我不熟悉GDI+。有什么建议吗?

如何在自定义字符串中高亮我想要的子字符串

我认为你要找的函数是MeasureString()。如果你在你想要突出显示的部分之前和之后打破你的字符串,然后在每个子字符串上调用MeasureString,然后你会得到你正在寻找的开始和结束点。