0

私は基本的に、List-View コントロールで得られるのと同じ仮想パフォーマンスを実現したいと考えています。List-View コントロールを使用すると、ItemCount を設定でき、LVN_GETDISPINFO 通知で、アイテムがスクロールして表示されるようになったら、アイテムの情報を入力できます。

現在、ツリービューが提供する仮想機能は非常に深いツリーに適しているため、(TVN_ITEMEXPANDING を介して) ノードが展開されたときにのみアイテムを追加し、アイテムがスクロールして表示されると、TVN_GETDISPINFO を使用してアイテム情報を入力できます。しかし、TVN_ITEMEXPANDING が何の役にも立たず、アイテムが表示されたら追加したい "常に展開された" 2 レベルのツリー (設計上の問題のみ) がある場合はどうすればよいでしょうか。問題は、既にツリーのサイズを変更する SetItemCount() などのようなものがないことです。

私の場合、アイテム情報 (テキスト、画像、選択した画像) の入力は高価な部分ではありませんが、アイテムの挿入 (すべて 1 つのレベルで) は重要です。

1 つのオプションは、表示されるアイテムと 1 つの非表示のアイテムのみを挿入することです。非表示のアイテムが表示されると (TVN_GETDISPINFO で検出されます)、さらにいくつか挿入します。しかし、下にスクロールすればするほど、スクロールバーは常に小さくなります。それは奇妙だと思います。

自分のコントロールを描画する以外に、私が望むものを達成するための他のアイデアはありますか?

ツリー全体は次のようになります。ほぼリストです。ツリーの外観が気に入っているだけです。

RootNode
|
|--Item 1
|--Item 2
|--Item 3
|--Item 4
|--Item 5
|--Item 6
|--Item 7
...
|__Item 1000
4

2 に答える 2

2

他の多くの投稿で述べられているように、Tree-View コントロールに関する非常にコストのかかる部分は、InsertItemandの使用DeleteItemです。これらの操作のパフォーマンスを向上させる簡単な方法は、 を利用することですSetRedraw。ちらつきを隠すだけでなく、描画が高価に見えるため、実際に速度が向上します-TVN_GETDISPINFO使用されているにもかかわらず.

また、新しい項目を削除して追加するよりも、既存の項目の名前を変更してそのデータを変更する方が高速です。したがって、大きなリストがあり、次の更新にほぼ同じ量 +/- 数個が含まれることがわかっている場合は、アイテムを反復処理し、名前を変更し、lparams を変更し、残りのものを同期 (つまり、削除/追加) します。新しいデータによると。リストのサイズによっては、これらの追加の計算を行うと、パフォーマンスが大幅に向上する可能性があります。

于 2013-07-01T02:18:13.987 に答える
1

Win32 TreeView コントロールは、探している種類の仮想モードをサポートしていません。したがって、カスタム コントロールが必要になります。

于 2013-06-27T08:37:52.813 に答える