トップ回答者
リストコントロールでのソートの仕方

質問
-
お世話になっております。
MFCでダイアログベースで開発をしております。OSはXPです。
リストで表示されているファイルをソートしたいと考えています。
フォルダを監視して、そこにファイルが入ってきたらリストにファイル名を表示するといった感じのプログラムです。
現在は、一番最初に入ってきたものが一番上段で表示されているのですが、一番最後に入ってきたものが一番上段で表示されるようにするためには、どのようにしたらよいのでしょうか?
SortItemというメソッドは見つけたのですが使い方がいまいちわかりません。
SortItemをつかってできるのか、はたまた別の方法のほうがよいのか?
ご教授願えないでしょうか?よろしくお願いします。
回答
-
まず、C言語の関数ポインタは理解されているでしょうか?これがわかっていないとあの説明はちょっとわかりづらいです。Win32 APIのEnum系の関数などでも多く使用します。
SortItemは引数に比較用の関数のアドレスを渡します。この渡す関数のアドレスをburuさんが定義します。CListCtrl::SortItemは渡された比較用の関数を呼び出して、その戻り値に応じて、再描画を行います。たとえば、比較用の関数をburuさんがこんな形で作ります。
int CALLBACK buruCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
//中は自分で考える
}
この比較用関数はstaticなメンバか、もしくはグローバル(いわゆるCの外部参照可能な関数)でなくてはなりません。
lParam1,lParam2にはLVITEM構造体のlParamメンバで指定した値が入ります。buruさんがLVITEM.lParamの値をフォルダに追加された順に値を加算しているのであれば、単純にlParam1とlParam2の比較でいいでしょう。
- 回答としてマーク 高橋 春樹 2009年6月25日 7:21
-
SortItemと言う関数は何らかの情報を元にアイテムをソートする事が目的になります。
従って一番最後に入ってきた物と言う条件でソートしたいのであれば、そういう順番になるように
する為にはどんな情報が必要かと言うところから考える必要があります。
単純に最後に追加したアイテムを最上段にしたいだけならB_Wolfさんが書かれているように
InsertItemでアイテムを追加する位置を先頭にすれば良いだけです。
この場合、リストコントロールのソートはしない設定にしておく必要があります。
CListCtrl::InsertItemの説明をよく読んで見てください。
自ずと使い方が見えてくると思います。
逆にそういう使い方が見えてくるまで関数の仕様をよく理解するようにした方が良いです。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク 高橋 春樹 2009年6月25日 7:21
すべての返信
-
まず、C言語の関数ポインタは理解されているでしょうか?これがわかっていないとあの説明はちょっとわかりづらいです。Win32 APIのEnum系の関数などでも多く使用します。
SortItemは引数に比較用の関数のアドレスを渡します。この渡す関数のアドレスをburuさんが定義します。CListCtrl::SortItemは渡された比較用の関数を呼び出して、その戻り値に応じて、再描画を行います。たとえば、比較用の関数をburuさんがこんな形で作ります。
int CALLBACK buruCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
//中は自分で考える
}
この比較用関数はstaticなメンバか、もしくはグローバル(いわゆるCの外部参照可能な関数)でなくてはなりません。
lParam1,lParam2にはLVITEM構造体のlParamメンバで指定した値が入ります。buruさんがLVITEM.lParamの値をフォルダに追加された順に値を加算しているのであれば、単純にlParam1とlParam2の比較でいいでしょう。
- 回答としてマーク 高橋 春樹 2009年6月25日 7:21
-
SortItemと言う関数は何らかの情報を元にアイテムをソートする事が目的になります。
従って一番最後に入ってきた物と言う条件でソートしたいのであれば、そういう順番になるように
する為にはどんな情報が必要かと言うところから考える必要があります。
単純に最後に追加したアイテムを最上段にしたいだけならB_Wolfさんが書かれているように
InsertItemでアイテムを追加する位置を先頭にすれば良いだけです。
この場合、リストコントロールのソートはしない設定にしておく必要があります。
CListCtrl::InsertItemの説明をよく読んで見てください。
自ずと使い方が見えてくると思います。
逆にそういう使い方が見えてくるまで関数の仕様をよく理解するようにした方が良いです。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク 高橋 春樹 2009年6月25日 7:21
-