ListView 나는 아이템보기 (예를 들어, 목록보기에서 특정 문자열 강조 표시)를 조정하려는 곳에서 항목을 표시하는 방식을 근본적으로 변경하고 싶지는 않습니다.ListView OwnerDraw의 기본 구현
OwnerDraw을 true로 설정하고 강조 표시 효과를 그리는 방법에 대해 머리를 맞출 수는 있지만 기본 구현을 지연하여 목록보기 항목의 나머지 부분을 그릴 때마다 문제가 발생합니다. 사실은 완전히 잘못되었다는 것을 나타내는 전체적인 그래픽 문제가 남았습니다.
DrawItem
및 DrawSubItem
이벤트의 "기본"처리기가 내 이해를 돕고 내 코드를 더 쉽게 조정할 수있는 곳이 있습니까? 여기에 참고로
이 조각은 내가 현재 뭘하는지 보여주는이 완전히 당신을 도울 것입니다 경우
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();
}
난 당신이 잘못 무슨 일이 일어나고 있는지에 대한 자세한 정보를 추가 할 필요가 있다고 생각합니다. 나는 당신의 코드를 테스트했고 그것은 ... 오케이. "Term"이라는 단어를 노란색 상자로 강조 표시했습니다. 어쩌면 드로잉 결과의 이미지를 보여줄 수도 있습니다. – LarsTech
@LarsTech 더 이상 볼 수없는 선택 효과 (위의 샘플에서 볼 수 있음)에서 항목 텍스트를 "이중 렌더링"으로, 항목 위로 마우스를 가져 가면 사라지는 등 광범위한 문제가 발생합니다. 나는 누군가가이 문제들 중 일부 또는 전부를 마술로 해결할 수있을 것이라고 기대하지는 않는다. (미래 사용자를 돕기에는 너무 구체적 일 것이다.) 오히려 모든 것을 가능한 한 가깝게 만드는 예제 구현을보고 싶다. 표준 구현 – Justin