0

我有一个列表框,显示每行中 (X,Y) 的一些位置。

不知何故,用户可以在文本框中输入几个 (X,Y) 对,然后按下按钮。

现在我想要做的是:每次用户输入 3 或 4 个(X,Y)对时,我的算法都会找到匹配的对,并且这些对应的对应该同时突出显示(比如说粉红色/红色/任何颜色)一起在列表框中。

如何用我想要的颜色突出显示这些对(相同的索引)?


第 1 版:

NikolaD - Nick的指导下,我将 DrawMode 更改为OwnerDrawVariable并在 lsBoxFeature_DrawItem 方法中添加了以下代码:

private void lsBoxFeature_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawFocusRectangle();
        Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height);
        Graphics g = Graphics.FromImage(bmp);


            foreach (var item in globalDataForAllMatchedFrames[globalDataForAllMatchedFrames.Count - 1].featureNumber)
            {
                if (lsBoxFeature.Items[e.Index].Equals(item))//your method that determines should current item be highlighted 
                {
                    g.Clear(Color.Red);
                }
                else
                {
                    g.Clear(lsBoxFeature.BackColor);
                }

                g.DrawString(lsBoxFeature.Items[e.Index].ToString(), lsBoxFeature.Font, new SolidBrush(lsBoxFeature.ForeColor), e.Bounds);
                e.Graphics.DrawImage(bmp, e.Bounds);
                g.Dispose();
            }

    }

item 是一个 PointF 对象,现在每次 item 等于 listBoxFeature 中的那些成员时,它应该以红色突出显示它们。

有两个问题:

I)似乎methos .Equals在if条件下无法正常工作以检查pointF项目是否等于listBoxFeature中的成员===>因此我的listBoxFeature中没有显示任何内容

II)即使当我运行代码时,我也会收到如下错误消息:

在此处输入图像描述


第 2 版:

我遵循NikolaD - Nick的建议,它奏效了!!!。但是有一小部分需要解决,它没有显示 lsBoxFeature 中每一行的文本(PointF 坐标)。

这是它现在的样子:

在此处输入图像描述

这是输出应该是这样的:

在此处输入图像描述

我怎样才能在 lsBoxFeature 中取回该行的 tex?

4

1 回答 1

3

您应该添加ListView的事件处理程序并在检查应该着色DrawItem时绘制突出显示。Items像这样的东西:

        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
                e.DrawFocusRectangle();
                Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height);
                Graphics g = Graphics.FromImage(bmp);

                if (MeetsCriterion(listBox1.Items[e.Index]))//your method that determines should current item be highlighted 
                {
                    g.Clear(Color.Red);
                }
                else
                {
                    g.Clear(listBox1.BackColor);
                }
                g.DrawString(listBox1.Items[e.Index].ToString() , listBox1.Font, new SolidBrush(listBox1.ForeColor), e.Bounds);
                e.Graphics.DrawImage(bmp, e.Bounds);
                g.Dispose();
        }

检查这个问题,有一个更详细的答案如何做到这一点:如何在某些行中将相同的字符串添加到 ListBox?

**编辑:**此编辑是在您编辑了您的问题之后。对 listBox 中的每个项目调用 lsBoxFeature_DrawItem 事件处理程序,而不是对所有项目调用一次。第一个问题是为对象调用 Equals() 方法(ListBox 中的项是对象)有效地比较其他对象的引用,而不是 PointF 的值。第二个问题是您处理了 Graphic 对象,然后调用了 g.Clear()在处置的对象上。我已经重写了你的代码,我认为它现在可以工作了。

private void lsBoxFeature_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawFocusRectangle();
            Bitmap bmp = new Bitmap(e.Bounds.Width, e.Bounds.Height);
            Graphics g = Graphics.FromImage(bmp);

            bool found = false;
            int count = 0;
            PointF pF1 = (PointF)lsBoxFeature.Items[e.Index];
            while (!found && count < globalDataForAllMatchedFrames[globalDataForAllMatchedFrames.Count - 1].featureNumber.Count)
            {
                //next two lines are here to show you the problem with equals!!!!

                PointF pF2 = (PointF)globalDataForAllMatchedFrames[globalDataForAllMatchedFrames.Count - 1].featureNumber[count];
                if(pF1.Equals(pF2))
                {
                    found = true;
                }
                count++;
            }

            if (found)//your method that determines should current item be highlighted 
            {
                g.Clear(Color.Red);
            }
            else
            {
                g.Clear(lsBoxFeature.BackColor);
            }
            g.DrawString(lsBoxFeature.Items[e.Index].ToString(), lsBoxFeature.Font, new SolidBrush(lsBoxFeature.ForeColor),  new Rectangle(e.Bounds.X,0,e.Bounds.Width,e.Bounds.Height));
            e.Graphics.DrawImage(bmp, e.Bounds);
            g.Dispose();

        } 
于 2012-11-17T09:20:38.340 回答