2009-08-22 3 views
7

私は、WinFormsアプリケーションのカスタムListBoxコントロールのDrawModeとしてOwnerDrawFixedを使用しています。 ListBoxItemのListBox DrawItem OwnerDrawモードのHotLight状態?

私は背景を再描画(またはいくつかの他のアクションを行う)したい...

DrawItemState.HotLightので、リストボックスのために働くことはありません、ユーザーがリストボックスの項目の上に置いたときに、それはのMouseMoveで、あります私はどのようにこの問題を回避する方法、それをエミュレートするのだろうか。

答えて

11

それはあなたのための答えを見つけるためにわずか2年かかりましたが、ここでは、次のとおりです。

DrawItemState.HotLightは所有者のみ描画されたメニューではなく、リストボックスに適用されます。 ListBoxの場合は、自分で項目を追跡する必要があります。

public partial class Form1 : Form 
{ 
    private int _MouseIndex = -1; 

    public Form1() 
    { InitializeComponent(); } 

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
    Brush textBrush = SystemBrushes.WindowText; 

    if (e.Index > -1) 
    { 
     if (e.Index == _MouseIndex) 
     { 
     e.Graphics.FillRectangle(SystemBrushes.HotTrack, e.Bounds); 
     textBrush = SystemBrushes.HighlightText; 
     } 
     else 
     { 
     if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
     { 
      e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds); 
      textBrush = SystemBrushes.HighlightText; 
     } 
     else 
      e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds); 
     } 
     e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, textBrush, e.Bounds.Left + 2, e.Bounds.Top); 
    } 
    } 

    private void listBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
    int index = listBox1.IndexFromPoint(e.Location); 
    if (index != _MouseIndex) 
    { 
     _MouseIndex = index; 
     listBox1.Invalidate(); 
    } 
    } 

    private void listBox1_MouseLeave(object sender, EventArgs e) 
    { 
    if (_MouseIndex > -1) 
    { 
     _MouseIndex = -1; 
     listBox1.Invalidate(); 
    } 
    } 
} 
+2

さて、2年後にも私を助けました! ;)リストボックスの「ホットトラッキング」のための素敵な、簡単な方法...ありがとう! – ChandlerPelhams

+1

そしてLarsTechは何年も多くの人を助けてくれるでしょう...私は同様の答えを探していて、ここでそれを見つけました。ありがとう。 – ThN

+0

これはどのようにしてコンボボックスに対して行うことができますか? ComboboxにはIndexFromPointはありません。 –

0

このソリューションは、コードの重さを測ります。

If e.State And DrawItemState.Selected Then 
        e.Graphics.FillRectangle(SystemBrushes.HotTrack, e.Bounds) 
        e.Graphics.DrawString(drv, Me.Font, SystemBrushes.HighlightText, e.Bounds.X + 18, e.Bounds.Y + 1) 
       Else 
        e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds) 
        e.Graphics.DrawString(drv, Me.Font, SystemBrushes.ControlText, e.Bounds.X + 18, e.Bounds.Y + 1) 
End If 

この操作はe.State And DrawItemState.Selectedです。この操作は、アイテムがホバリングされていることを確認します。どんなアイテムがホバリングされているかを知るためにコード全体を入れる必要はありません。

+0

あなたのソリューションは、OPが求めていた問題に実際には対処していません。 – LarsTech

関連する問題