0

我一直在研究我自己的自动完成组合框和文本框。起初,我只是搜索包含在文本框或组合框的 .Text 属性中的任何内容作为子字符串的匹配项。这对用户来说是一个非常直观的算法,所以我的显示可能匹配项的无边框列表框弹出窗口实际上不需要在下面的可能匹配项中突出显示子字符串。

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

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

我想这样做,如果用户在框中键入“Bob Coconut”甚至“Bob Coco 42”,那么该记录将出现在下拉列表中,因为它在第一种情况下包含“Bob”和“Coconut”,并且因为在第二种情况下,“Bob”和“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+。有什么建议么?

4

1 回答 1

1

我认为您正在寻找的功能是MeasureString()。如果您在要突出显示的部分之前和之后断开字符串,然后在每个子字符串上调用 MeasureString ,那么您将获得您正在寻找的起点和终点。

于 2013-05-14T07:14:27.550 回答