0

各行の(X、Y)の位置を示すリストボックスがあります。

どういうわけか、ユーザーはテキストボックスにいくつかの(X、Y)ペアを入力し、ボタンを押すことができます。

今私がやりたいのは、ユーザーが3つまたは4つの(X、Y)ペアを入力するたびに、私のアルゴリズムは一致するペアを見つけ、それらの対応するペアがすべて同時にハイライトされる(たとえばピンク/赤/任意の色)必要があることです。リストボックスで一緒に。

これらのペア(同じインデックス)を希望の色で強調表示するにはどうすればよいですか?


初版:

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のメンバーと等しくなるたびに、それらを赤で強調表示する必要があります。

2つの問題があります:

I)methos.Equalsがif-conditionで正しく機能しないため、pointFアイテムがlistBoxFeatureのメンバーと等しいかどうかを確認します===>その結果、listBoxFeatureに何も表示されません

II)コードを実行しても、次のようなエラーメッセージが表示されます。

ここに画像の説明を入力してください


第2版​​:

NikolaD-Nickのアドバイスに従いましたが、うまくいきました!!!。しかし、解決すべき小さな部分があり、lsBoxFeatureの各行のテキスト(PointF座標)が表示されません。

これが今の様子です:

ここに画像の説明を入力してください

出力は次のようになります。

ここに画像の説明を入力してください

行のtexをlsBoxFeatureに戻すにはどうすればよいですか?

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

この質問を確認してください。より詳細な回答があります。同じ文字列をいくつかの行のリストボックスに追加するにはどうすればよいですか。

**編集:**この編集は、質問を編集した後のものです。lsBoxFeature_DrawItemイベントハンドラーは、すべてのアイテムに対して1回ではなく、listBox内のアイテムごとに呼び出されます。最初の問題は、Equals()メソッドがオブジェクトに対して呼び出されることでした(ListBox内のアイテムはオブジェクトです)。PointFの値ではなく、他のオブジェクトの参照を効果的に比較します。2番目の問題は、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 に答える