none
CListCtrlにてソート終了を知る方法 RRS feed

  • 質問

  • こんにちわ。

    CListCtrlを用いてカラムクリックイベントでソートを実現しています。ソートは出来ているのですが、ソートされた結果に基づいて有るカラムの内容を変更したいので、ソートが終了しリスト表示が更新されたことを知りたいのですが、その方法が分からず困っています。

     

    SortItemにて呼ばれるCompareFuncが全て呼び出され、リストの更新が終了したことを知る方法は無いでしょうか?

    • 編集済み EmoraEmora 2011年1月24日 10:25 Typo
    2011年1月24日 8:25

回答

  • SortItems の処理が終わっていれば、画面の更新は考慮しなくてもよいのなら、

    CListCtrl の派生クラスを作成し、そこで、LVM_SORTITEMS メッセージをトラップすれば、SortItems の呼び出しをトラップできます。

    中身を

    {
     Default();
     // ソート終了後にやりたいこと
    }
    
    

    としてやれば、CListCtrl のソート処理が終わった後に、やりたいことができます。ただし、この時点ではまだ画面は再描画されていません。

    どうしても、ソート後の再描画の後に...という場合は、フラグを立てておいて、WM_PAINT を受け取るようにすれば対処できます。

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク EmoraEmora 2011年1月25日 6:31
    2011年1月24日 11:39

すべての返信

  • SortItems の処理が終わっていれば、画面の更新は考慮しなくてもよいのなら、

    CListCtrl の派生クラスを作成し、そこで、LVM_SORTITEMS メッセージをトラップすれば、SortItems の呼び出しをトラップできます。

    中身を

    {
     Default();
     // ソート終了後にやりたいこと
    }
    
    

    としてやれば、CListCtrl のソート処理が終わった後に、やりたいことができます。ただし、この時点ではまだ画面は再描画されていません。

    どうしても、ソート後の再描画の後に...という場合は、フラグを立てておいて、WM_PAINT を受け取るようにすれば対処できます。

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク EmoraEmora 2011年1月25日 6:31
    2011年1月24日 11:39
  • ご回答有難うございます。

     

    WindowProc()にて、LVM_SORTITEMS を監視し

        if( message == LVM_SORTITEMS ){
            Default();

    // ここに処理を追加
        }

     

    としたのですが、LVM_SORTITEMSが飛んできた後、更にCompareFuncが呼び出されています。

    監視場所が間違ってるのでしょうか。

     

    初心者にてすみません。お手数おかけします。

    2011年1月25日 5:47
  • Default();

    の処理を終えた後でも CompareFunc が呼ばれるのでしょうか?

    もしかして、Default(); を呼び出して、処理した後にリターンせずにそのままにしていませんか?

    もし、そうだとするとソートを2回やってることになります。動作自体も問題ないので、そのあたりをチェックしてみてください。

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2011年1月25日 6:05
  • とっちゃんさん、

     

    おお、ご指摘の通りでした、期待の動作が確認できました。感謝!

    2011年1月25日 6:30