VC++6.0 MFC WindowsXP sp2
ファイルの検索処理を行っております。
仮想リストを利用してビューにアイテムを表示しているのですが、
仮想リストを使用すると画面の幅分のアイテムをいっきに表示しているので
検索で見つかったアイテムをすぐに表示することができません。
なにか良いアイディアがおありでしたら教えてください。
CListCtrlの仮想リストコントロールの事ですか?
仮想リストコントロールの場合、CListCtrlからの要請にしたがって表示する内容を
CListCtrlに渡すような感じだったと思うんですが、
常に最後に追加したアイテムを表示したいのであれば、
CListCtrlに対してそのアイテムを表示するように指示すればよいのではないでしょうか?
CListCtrlのメンバー関数を使えば出来ると思いますけれど。
メンバー関数の一覧とにらめっこしてみてはどうでしょう?
検索プロセスをスレッド化して
検索結果が増えるたびに
SetItemCount
RedrawWindow
をコールすればいいんじゃないでしょうか?
この場合、メモリ上のリストにスレッドとリストビューと同時にアクセスする
可能性があるから排他制御にも注意が必要ですが。
更新されるタイミングでスクロールバーが初期化(一番上になる)されるのですが、
何かうまい方法ってご存知の方教えてください。
Scrollメソッドでスクロールさせても駄目なんですか?
仮想リストコントロールの説明を読む限りでは行けそうな気がするんですけれど。
以下のコードでうまく動いているようです。
CLIstCtrl m_lvwData;
int m_iCount;
// この辺にm_iCountを増やす処理
m_lvwData.SetItemCountEx(m_iCount);
CSize size = m_lvwData.ApproximateViewRect();
m_lvwData.Scroll(size);
因みに上記のコードはかなり省略して核心の部分だけです。
足りない部分は補完して考えてください。
PATIOさんの通りに実行してみました。
結果ですが、
何かアイテムを選択しないとスクロールが初期化されてしまいます。
選択した場合、選択したアイテムが画面のTOPに表示されてしまいます。
アイテムを選択しない場合でもスクロールの初期化をしないようにするにはどうすれば
よいでしょうか
うーん、私のところでは特にアイテムの選択をしたりしていないんですが、
普通にスクロールしてくれます。追加した行が最後の追加される形になりますが、
表示はきちんと追随してくれています。
他の部分の処理で初期化が起こるような処理が入っていないでしょうか。
私が実験した最小限の環境では、CListCtrlにオーナーデータの設定を行い、
レポート形式に設定しているだけです。
コードの追加もInitDialogでカラムの追加とイメージリストの設定、
SetItemCountExで1を設定。
OnLvnGetdispinfoLvwDataで同じ文字列をひたすら返すだけのコード
カウントを増やすためのボタンをつけてますが、
これのクリック時の処理に提示したコードがあるだけの状態です。
これでうまく動作しているようなのでこれ以外の処理をCListCtrlに行っている所に
原因があるのではとも思うのですけれど。
もしかして.NET2003だと動作が変わるんでしょうか。
実験したのが.NET2003だったので。
> 更新されるタイミングでスクロールバーが初期化(一番上になる)されるのですが、
> 何かうまい方法ってご存知の方教えてください。
とりあえずヘルプを見ただけですが、
listCtrl.SetItemCountEx(count, LVSICF_NOINVALIDATEALL | LVSICF_NOSCROLL);
でいかがでしょう?
外してたらすみません。
全く同じコードをVC6でも試してみましたが、うまく動きます。
選択状態を常に表示するにしておいて選択してみましたが、
動きは変わらず。選択してもしなくても動作は同じようです。
因みに私のコードでは、LVSICF_NOSCROLLを指定していません。
LVSICF_NOINVALIDATEALLはデフォルト値のようです。
テスト用のコードの中で使用しているCListCtrlクラスのメソッドは、
以下のものだけです。他のメソッドは一切使用していません。
InsertColumn
SetImageList
SetItemCountEx
ApproximateViewRect
Scroll
既に書いていますが、最小限のコードでは動くようなので
CListCtrlに対して他の処理を行ったりしていないでしょうか?
もしくは、RedrawWindow等のコードが他の部分に残っていませんか?
Kerry さんの方法で無事できました。
ありがとうございました。