1

リストコントロールを使用して、ベクトル内の要素の表現を表示しています。リストをクリックすると、別のコントロールにその要素に関する情報が表示されます。要素のインデックスは現在、コントロール内のインデックスによって決定されていますが、結果を並べ替えたりフィルタリングしたりする場合、これは機能しなくなります。

仮想リストコントロールを使用できると言われましたが、MSDNはあまり友好的ではありません。誰かが、このために仮想リストコントロールを使用する方法を教えてくれますか?

4

4 に答える 4

5

率直に言って、データ (データ ベクトル内の位置) をリスト コントロール内のデータの表示 (リスト ctrl 内の位置) に結び付けることは避けたいと思います。

MFC では、各コントロールには「Data」DWORD メンバー変数があります。MFC でコーディングするときは、関連する行が参照するポインターに追加されて渡される各項目に対して常に「SetItemData」を呼び出します。 YourListCtrl.SetItemData((DWORDPTR)&YourData);

次に、 ListCtrl アイテムが選択されたら、呼び出すだけです

DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));

またはそのようなもの。

または、ポインターを使用したくない場合は、元のベクターの項目のインデックスを行の itemdata に保持します (上記の fns に渡すだけです)。

于 2008-10-09T14:28:18.633 に答える
1

仮想リストコントロールの目的はまったく異なります。リストに多数のアイテムがある場合(2500以上)、パフォーマンス上の理由から使用する必要があります。

あなたの場合、必要なのは、NotJarvisが説明しているように、ベクトルインデックスをリストアイテムデータに保存することだけです。

于 2008-10-09T18:34:54.300 に答える
1

仮想リスト コントロールを使用するには、LVS_OWNERDATA スタイルを設定します。次に、LVN_GETDISPINFO 通知メッセージ (WM_NOTIFY 経由で送信される) を処理する必要があります。

これを行う場合、表示される順序を含め、データに対して全責任を負います。したがって、並べ替えなどを処理するのはあなた次第です。

最も簡単な方法は、項目データを使用して、元のデータを取得するために使用できる ID を設定/取得することです。これは、ベクター インデックス、データへのポインター、連想コンテナーへのキーなどです。

于 2008-10-09T14:59:15.997 に答える
1

それは本当にあなたが必要とするパフォーマンスに依存します.

個人的には、大量のデータを保持するリストのパフォーマンスが大幅に向上するのを見てきました。ただし、実装するのははるかに手間がかかるため、データがそれほど多くない単純な用途では、使用しないことをお勧めします。

基本的に、仮想リスト コントロールで何が起こるかというと、独自のデータ構造のどこかにデータがあるということです。リスト ビューにはデータ全体の小さなサブセットしか表示されないため、何かが発生した場合 (再描画が必要な場合、上下にスクロールする場合、並べ替えを変更する場合など) に表示するコンテンツを問い合わせます。

便利な例はありません。しかし、codeguru を見ることができます。出発点として非常に良い例があると確信しています。

于 2008-10-09T15:21:13.003 に答える