Tengo un ListView donde deseo ajustar el dibujo de los elementos (por ejemplo, resaltar ciertas cadenas en los elementos de vista de lista), sin embargo, no quiero alterar radicalmente la forma en que se muestran los elementos.Implementación predeterminada para ListView OwnerDraw
He configurado el OwnerDraw como verdadero y puedo entender cómo dibujar mi efecto de resaltado, sin embargo cada vez que trato de diferir a la implementación predeterminada para dibujar el resto de la lista veo que las cosas van mal y estoy me quedé con una gran cantidad de problemas gráficos que indicaban que realmente me había equivocado completamente.
¿Hay algún lugar donde pueda ver lo que los controladores "Predeterminados" para los eventos DrawItem
y DrawSubItem
hacen para que yo pueda entender mejor y modificar más fácilmente mi código?
Como referencia Aquí hay un fragmento que muestra lo que estoy haciendo actualmente:
public MyListView()
{
this.OwnerDraw = true;
this.DoubleBuffered = true;
this.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(MyListView_DrawColumnHeader);
this.DrawItem += new DrawListViewItemEventHandler(MyListView_DrawItem);
this.DrawSubItem += new DrawListViewSubItemEventHandler(MyListView_DrawSubItem);
}
private void MyListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
// Not interested in changing the way columns are drawn - this works fine
e.DrawDefault = true;
}
private void MyListView_DrawItem(object sender, DrawListViewItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();
}
private void MyListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
string searchTerm = "Term";
int index = e.SubItem.Text.IndexOf(searchTerm);
if (index >= 0)
{
string sBefore = e.SubItem.Text.Substring(0, index);
Size bounds = new Size(e.Bounds.Width, e.Bounds.Height);
Size s1 = TextRenderer.MeasureText(e.Graphics, sBefore, this.Font, bounds);
Size s2 = TextRenderer.MeasureText(e.Graphics, searchTerm, this.Font, bounds);
Rectangle rect = new Rectangle(e.Bounds.X + s1.Width, e.Bounds.Y, s2.Width, e.Bounds.Height);
e.Graphics.FillRectangle(new SolidBrush(Color.Yellow), rect);
}
e.DrawText();
}
Creo que es necesario agregar más información acerca de lo que va mal. Probé tu código y fue ... está bien. Se destacó la palabra "Término" con un cuadro amarillo. Tal vez muestre una imagen de los resultados del dibujo. – LarsTech
@LarsTech Recibo una amplia gama de problemas, que van desde que el efecto de selección ya no es visible (que se puede ver en la muestra anterior) hasta que el texto del elemento se "renderiza doblemente" y también desaparece cuando coloco el mouse sobre el elemento. No espero que alguien pueda solucionar mágicamente ninguno/todos estos problemas (que también sería demasiado específico para ayudar a los futuros usuarios), sino que me gustaría ver una implementación de ejemplo que haga que todo sea lo más parecido posible a la implementación estándar – Justin