0

レイモンド・チェンは次のように書いています。

TreeView共通コントロールは、項目を新しい親に移動することをサポートしていません。項目をその兄弟に対して相対的に移動したい場合 (ただし、同じ親の下に留まる)、> を使用TreeView_SortChildrenCBして、子を並べ替えるカスタム並べ替え関数を渡すことができます。 >望むように。」

TreeView_SortChildrenCB任意の順序に従って並べ替えを呼び出す方法の正確な例はどこにありますか(たとえば、double または文字列の並べ替え)? ドキュメンテーションは、経験豊富な C++ プログラマーであるがこの関数に慣れていない人にとっては明確ではありません。

ありがとう。

4

1 に答える 1

0

まず、TVSORTCB のインスタンスを設定します。hParent は、ソートしたいツリー内の項目でなければなりません。lpfnCompare は、次のような静的関数でなければなりません。

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    /*your casting of lParams and sorting code here*/
}

この関数の目的は、lParam1 が lParam2 より「小さい」かどうかを判断することです。

構造体の lParam 値は、コールバック (lParamSort) の 3 番目の引数として渡したいものであり、0 にすることができます

次に、その構造体インスタンスのアドレスを TreeView_SortChildrenCB の 2 番目のパラメーターとして渡します。

コールバック (lParam1/2) に渡される 2 つの引数は、ツリーに挿入された各項目に関連付ける値です。すべてではないにしてもほとんどの一般的なコントロールでは、lParam 値をコントロール内の選択可能な各項目に関連付けることができます。この場合、これは TreeView_InsertItem に渡す TVINSERTSTRUCT の TVITEM 構造体の lParam 値です ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb773898(v=vs.85))。 aspx )

多くの場合、これは、文字列または比較可能な他の構造体を含むテーブルへの単なるインデックスです。そのテーブルを指すように TVSORTCB の lParam を設定した場合、コールバックの 3 番目の引数をそのテーブル構造にキャストすることによって、おそらくそのテーブルにアクセスできるようになります。

それが明確でない場合は申し訳ありません。win32 API は、lParam メカニズムを過度に使用して、データを GUI API のほぼすべてのハンドルに関連付ける傾向があります。文字列/構造体を割り当て、新しいメモリのアドレスをツリー項目の lParam に割り当てるという罠にはまらないでください。ツリー内のすべてのアイテムの割り当てを削除しないと、メモリ リークが発生します。

于 2012-07-03T21:17:12.447 に答える