2009-08-22 10 views
7

Estoy usando OwnerDrawFixed como DrawMode para el control ListBox personalizado en mi aplicación WinForms.ListBox DrawItem HotLight ¿Estado en el modo OwnerDraw?

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, por lo Me pregunto cómo emularlo, cómo solucionar este problema.

Respuesta

11

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

¡Bueno, 2 años después también me ayudaste! ;) Manera agradable y simple para 'seguimiento caliente' en un cuadro de lista ... ¡gracias! – ChandlerPelhams

+1

Y LarsTech ayudará a muchos durante muchos años ... Estaba buscando una respuesta similar y la encontré aquí. Gracias. – ThN

+0

¿Cómo se puede hacer esto para un combobox? Combobox no tiene IndexFromPoint. –

0

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 es necesario poner un paquete completo de código solo para saber qué elemento está suspendido.

+0

Su solución en realidad no aborda el problema sobre el que estaba haciendo la OP. – LarsTech

Cuestiones relacionadas