Pregunta

Estoy usando OwnerDrawFixed como DrawMode para el control ListBox costumbre en mi aplicación WinForms.

Quiero volver a pintar el fondo (o hacer alguna otra acción) de la ListBoxItem cuando el usuario se desplaza sobre el elemento de cuadro de lista, es decir, en el MouseMove ...

DrawItemState.HotLight nunca funciona para el cuadro de lista, así que me pregunto cómo emular, cómo solucionar este problema.

¿Fue útil?

Solución

Me tomó sólo dos años para encontrar la respuesta para usted, pero aquí está:

El DrawItemState.HotLight sólo se aplica a los menús propietario dibujado, no el cuadro de lista. Para el cuadro de lista, usted tiene que hacer un seguimiento del mismo tema:

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

Otros consejos

Esta solución se acaba de pesar a su código de abajo; acaba de intentar esto:

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

Esta operación: e.State And DrawItemState.Selected verifica que el artículo se cernía. No hay necesidad de poner un paquete entero de código sólo para saber lo que el tema se cernió.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top