リストコントロールを使用して、ベクトル内の要素の表現を表示しています。リストをクリックすると、別のコントロールにその要素に関する情報が表示されます。要素のインデックスは現在、コントロール内のインデックスによって決定されていますが、結果を並べ替えたりフィルタリングしたりする場合、これは機能しなくなります。
仮想リストコントロールを使用できると言われましたが、MSDNはあまり友好的ではありません。誰かが、このために仮想リストコントロールを使用する方法を教えてくれますか?
リストコントロールを使用して、ベクトル内の要素の表現を表示しています。リストをクリックすると、別のコントロールにその要素に関する情報が表示されます。要素のインデックスは現在、コントロール内のインデックスによって決定されていますが、結果を並べ替えたりフィルタリングしたりする場合、これは機能しなくなります。
仮想リストコントロールを使用できると言われましたが、MSDNはあまり友好的ではありません。誰かが、このために仮想リストコントロールを使用する方法を教えてくれますか?
率直に言って、データ (データ ベクトル内の位置) をリスト コントロール内のデータの表示 (リスト ctrl 内の位置) に結び付けることは避けたいと思います。
MFC では、各コントロールには「Data」DWORD メンバー変数があります。MFC でコーディングするときは、関連する行が参照するポインターに追加されて渡される各項目に対して常に「SetItemData」を呼び出します。
YourListCtrl.SetItemData((DWORDPTR)&YourData);
次に、 ListCtrl アイテムが選択されたら、呼び出すだけです
DataTypeYouWant* pData = (DataTypeYouWant*)(YourListCtrl.GetItemData(indexofselecteditem));
またはそのようなもの。
または、ポインターを使用したくない場合は、元のベクターの項目のインデックスを行の itemdata に保持します (上記の fns に渡すだけです)。
仮想リストコントロールの目的はまったく異なります。リストに多数のアイテムがある場合(2500以上)、パフォーマンス上の理由から使用する必要があります。
あなたの場合、必要なのは、NotJarvisが説明しているように、ベクトルインデックスをリストアイテムデータに保存することだけです。
仮想リスト コントロールを使用するには、LVS_OWNERDATA スタイルを設定します。次に、LVN_GETDISPINFO 通知メッセージ (WM_NOTIFY 経由で送信される) を処理する必要があります。
これを行う場合、表示される順序を含め、データに対して全責任を負います。したがって、並べ替えなどを処理するのはあなた次第です。
最も簡単な方法は、項目データを使用して、元のデータを取得するために使用できる ID を設定/取得することです。これは、ベクター インデックス、データへのポインター、連想コンテナーへのキーなどです。
それは本当にあなたが必要とするパフォーマンスに依存します.
個人的には、大量のデータを保持するリストのパフォーマンスが大幅に向上するのを見てきました。ただし、実装するのははるかに手間がかかるため、データがそれほど多くない単純な用途では、使用しないことをお勧めします。
基本的に、仮想リスト コントロールで何が起こるかというと、独自のデータ構造のどこかにデータがあるということです。リスト ビューにはデータ全体の小さなサブセットしか表示されないため、何かが発生した場合 (再描画が必要な場合、上下にスクロールする場合、並べ替えを変更する場合など) に表示するコンテンツを問い合わせます。
便利な例はありません。しかし、codeguru を見ることができます。出発点として非常に良い例があると確信しています。