Mam ListView gdzie chcę poprawić rysunek elementów (na przykład podświetlanie niektórych ciągów w widokach widoku listy), jednak nie chcę radykalnie zmieniać sposobu wyświetlania elementów.Domyślna implementacja ListView WłaścicielDod
Ustawiłem OwnerDraw na true i mogę zorientować się, jak narysować efekt wyróżnienia, jednak za każdym razem, gdy próbuję odroczyć domyślną implementację, aby narysować resztę elementu widoku listy, coś pójdzie nie tak i jestem pozostawione z całym mnóstwem problemów graficznych wskazujących, że w rzeczywistości kompletnie poszedłem źle.
Czy jest coś, co mogę zobaczyć, co robią "Domyślne" programy obsługi zdarzeń DrawItem
i DrawSubItem
, dzięki czemu mogę lepiej zrozumieć i łatwiej podkręcić mój kod?
Dla odniesienia Oto fragment pokazujący co mam aktualnie robi:
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();
}
Chyba trzeba dodać więcej informacji o tym, co się dzieje źle. Przetestowałem twój kod i było ... ok. Podkreślono słowo "Term" żółtym polem. Może pokazać obraz wyników rysunku. – LarsTech
@LarsTech Otrzymuję szeroki zakres problemów, począwszy od efektu selekcji, który nie jest już widoczny (co widać w powyższym przykładzie), aż tekst pozycji jest "podwójnie renderowany", a także znikający po najechaniu myszą na element. Nie oczekuję, że ktoś będzie w stanie magicznie naprawić wszystkie/wszystkie te problemy (to też byłoby zbyt szczegółowe, by pomóc przyszłym użytkownikom), raczej chciałbym zobaczyć przykładową implementację, która odda wszystko tak blisko jak to możliwe standardowa implementacja – Justin