0

仮想および OwnerDraw モードで ListView コントロールを使用して、多数の項目を表示しています。描画イベントまたは RetrieveVirtualItem イベントをトリガーせずに、特定の項目が (コントロールのクライアント領域内で) 表示されているかどうかをテストする方法はありますか?

問題は、定期的にリストビューにアイテムを追加するバックグラウンド スレッドがあることです。しかし、何らかの理由で、アイテムを追加する (VirtualListSize をインクリメントする) たびに、最後に追加されたアイテムの RetrieveVirtualItem がトリガーされます。そしてもちろん、実際に見えるアイテムだけを描きたいです。

何か案は?

4

1 に答える 1

0

仮想リストでは、WindowsRetrieveVirtualItemは多くの奇妙な場所でイベントを発生させます。これらは XP、Vista、および Win7 の間で異なります。所有者が作成した仮想リストは最悪です。

RetrieveVirtualItemイベントの数を減らすことが目標である場合は、運が悪いです。

行に必要な再描画の回数を減らすことが目標である場合はOwnerDrawn、再描画をより直接的に最適化する方がよいでしょう。たとえば、WM_PAINTイベントで破損した領域の四角形をキャプチャし、それをサブアイテム描画メソッドで使用して、そのサブアイテムが破損しているかどうかを判断できます。

または、すでにこの問題に対処しているObjectListView (.NET WinForms ListView のオープン ソース ラッパー) を使用することもできます。水平スクロールと列の再配置を許可する場合は、ここで説明する理由により、ObjectListView を使用する必要があります

于 2009-12-08T13:41:41.953 に答える