2009-12-02 5 views
0

가상 및 OwnerDraw 모드에서 ListView 컨트롤을 사용하여 여러 항목을 표시하고 있습니다. 끌기 이벤트 또는 RetrieveVirtualItem 이벤트를 트리거하지 않고 특정 항목이 (컨트롤의 클라이언트 영역 내에서) 볼 수 있는지 테스트하는 방법이 있습니까?항목이 가상 ListView에 표시되는지 테스트

문제는 정기적으로 목록보기에 항목을 추가하는 배경 스레드가 있다는 것입니다. 그러나 몇 가지 이유로, 추가 항목을 추가 할 때마다 (VirtualListSize 증가) 마지막 항목에 대한 RetrieveVirtualItem이 트리거됩니다. 가시적 인 범위에 가깝지는 않지만 추가됩니다. 그리고 실제로 볼 수있는 항목 만 그리기를 원합니다.

아이디어가 있으십니까?

+0

DrawItem 이벤트는 표시되는 항목에만 발생한다고 생각했습니다. –

+0

아니요, VirtualListSize (목록의 마지막 항목)를 변경할 때마다 확실히 발생합니다. –

답변

0

가상 목록에서 Windows는 많은 이상한 장소에서 RetrieveVirtualItem 이벤트를 발생시킵니다. XP, Vista 및 Win7에서는 서로 다릅니다. 소유자가 그린 가상 목록은 최악입니다.

목표가 RetrieveVirtualItem 이벤트의 수를 줄이는 것이면 운이 좋지 않습니다.

OwnerDrawn 행에 필요한 다시 그리기 횟수를 줄이려면 더 직접적으로 다시 그리기를 최적화하는 것이 좋습니다. 예를 들어, WM_PAINT 이벤트에서 손상된 영역의 사각형을 캡처 한 다음 해당 하위 항목이 손상되었는지 확인하기 위해 하위 항목 그리기 방법에서 해당 영역을 사용할 수 있습니다.

또는 .NET WinForms ListView를 둘러싼 오픈 소스 래퍼 인 ObjectListView을 이미 사용할 수 있습니다.이 문제는 이미이 문제를 처리했습니다. 수평 스크롤 및 열 재 배열을 허용하려는 경우 은 ObjectListView를 사용하려고합니다. 이유는 explained here입니다.

관련 문제