3

リストボックス内のアイテムの高さを増やしたいのですが、基本的にはそれらを内部的に埋めるためです。それ以外は、デフォルトのリストボックスの動作を変更したくありません。所有者が描画したリストアイテムを実行するためのMSDNの例に従いましたが、問題があります。デフォルトのリストボックスは、アイテムを黒で描画し、選択したアイテムを白で青のハイライトで描画します。これと同じ機能を実現するために、DrawItemイベントハンドラーで次のコードを使用しました。

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        Brush b = (e.Index == ((ListBox)sender).SelectedIndex ? Brushes.White : Brushes.Black);
        e.DrawBackground();
        e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, b, new Rectangle(new Point(e.Bounds.X, e.Bounds.Y + 2), e.Bounds.Size));
        e.DrawFocusRectangle();
    }

リストをクリックする場合を除いて、これは正常に機能しているようです。選択したアイテムは青い背景に白いテキストとして表示されますが、前に選択したアイテムは白いままです。選択したアイテムが再描画されているようですが、以前に選択したアイテムは再描画されていません。別のコントロールに移動すると、リストボックスは正常に再描画されます。私は何が欠けていますか?

4

2 に答える 2

2

リスト ボックスにパディングを追加するには、リスト ボックスの .ItemHeight を特定の高さに設定するだけです。

それ以外の場合は、手動で色を選択する代わりに、オーナー ドローを行いたい場合は、e.ForeColor を使用します。このような:

Brush b = new SolidBrush(e.ForeColor);

このような場合、選択したアイテムの背景もペイントする必要があることに注意してください。リスト ボックス項目の状態の確認は、次のように実行できます。

e.Graphics.FillRectangle((e.State & DrawItemState.Selected) != 0 ? SystemBrushes.Highlight : SystemBrushes.Window, new Rectangle(new Point(e.Bounds.X, e.Bounds.Y + 2), e.Bounds.Size));
于 2012-12-20T19:47:15.353 に答える
0

回答: ListBox.SelectedIndex (ハンスが言ったように) 非常に不合理ですが、e.ForeColor十分に正しいです。代わりにそれを使用してください。

コードを次のように置き換えます。e.Index == ((ListBox)sender).SelectedIndex

e.ForeColor == SystemColors.HighlightText

 

裏付けデータ:

次の行を の先頭に追加しますlistBox1_DrawItem

Console.WriteLine("e.Index=" + e.Index + " SelectedIndex=" + 
  listBox1.SelectedIndex + " ForeColor=" + e.ForeColor);

次のような出力が生成されます ( // 注釈付き )

// Added 4 items to listbox
e.Index=0 SelectedIndex=-1 ForeColor=Color [WindowText]
e.Index=1 SelectedIndex=-1 ForeColor=Color [WindowText]
e.Index=2 SelectedIndex=-1 ForeColor=Color [WindowText]
e.Index=3 SelectedIndex=-1 ForeColor=Color [WindowText]

// MouseDown on item 0
e.Index=0 SelectedIndex=-1 ForeColor=Color [WindowText]
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText]
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText]
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText]
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText]
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText]
e.Index=1 SelectedIndex=0 ForeColor=Color [WindowText]
e.Index=2 SelectedIndex=0 ForeColor=Color [WindowText]
e.Index=3 SelectedIndex=0 ForeColor=Color [WindowText]
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText]
// MouseUp on item 0 (no DrawItem events)

// MouseDown for item 1
e.Index=0 SelectedIndex=0 ForeColor=Color [HighlightText]
e.Index=0 SelectedIndex=0 ForeColor=Color [WindowText]
e.Index=1 SelectedIndex=1 ForeColor=Color [HighlightText]
e.Index=1 SelectedIndex=1 ForeColor=Color [HighlightText]
// MouseUp for item 1 (no DrawItem events)

// MouseDown for item 2
e.Index=1 SelectedIndex=1 ForeColor=Color [HighlightText]
e.Index=1 SelectedIndex=1 ForeColor=Color [WindowText]
e.Index=2 SelectedIndex=2 ForeColor=Color [HighlightText]
e.Index=2 SelectedIndex=2 ForeColor=Color [HighlightText]

// Drag to item 3
e.Index=2 SelectedIndex=2 ForeColor=Color [HighlightText]
e.Index=2 SelectedIndex=2 ForeColor=Color [WindowText]
e.Index=3 SelectedIndex=3 ForeColor=Color [HighlightText]
e.Index=3 SelectedIndex=3 ForeColor=Color [HighlightText]
// MouseUp over item 3 (no DrawItem events)

つまり、基本的には... ListBox は必要以上に描画する可能性がありますが、最後の描画中に適切な色を取得することになります。

DoubleBufferingもお勧めします。

于 2014-01-14T11:29:12.623 に答える