MFC   VC++   Visual Studio   Visual Studio   プログラミング

CMFCShellListCtrlの表示項目 その2

 前回はカラム名を変更する方法を紹介しましたが、今回は列数を減らし、好みの項目だけを表示する方法を紹介します。
 単純に「SetColumnOrderArray」を使って並び替え、要らない列を削除すれば出来るのですが、ここでは別の方法を紹介します。

 まず、前回紹介した方法でカラム名を変更します。
 今回は、1列目に「ファイル名」、2列目に「更新日時」を表示させていきます。
 ちなみに、列の並び替えをせず、間の2・3列目を削除して上記の並び順にした場合、最初はきちんと表示されますが、階層を変えるなどした場合、当然ですが違うアイテムが入ります。

 そこで、リストにアイテムを入れるときに好みの列に入れるように改良します。
 方法は、「CMFCShellListCtrl」クラスを派生させ(ここでは「CMyMFCShellListCtrl」)、仮想関数「OnGetItemText」をオーバライドし、そこで入れる列を変更させます。
ヘッダファイル
    virtual CString OnGetItemText(int iItem, int iColumn, LPAFX_SHELLITEMINFO pItem);
cppファイル
CString CMyMFCShellListCtrl::OnGetItemText(int iItem, int iColumn, LPAFX_SHELLITEMINFO pItem)
{
    return CMFCShellListCtrl::OnGetItemText(iItem, iColumn == 1 ? 3 : iColumn, pItem);
}
 上記の様にコードはすごく簡単ですが、ここでちょっと説明すると、列を指定する「iColumn」が、今回変更する「更新日時」の"3"のときだけ、変更先である"1"にして呼び出すようにし、その他のときはそのまま呼び出すようにしてあります。
 この方法と同様に、違う列の内容を別の列に入れたい場合にも使えます。

 その他に、特定の列に独自の項目を入れたい場合も、ここで処理すればいろいろ改良することが出来ます。
 例えば、2列目に「作成日時」を入れたい場合は、「iColumn」が"1"のときに「pItem」から作成日時を取得し、文字列(CString)に変換して返せばいいです。
    if(iColumn == 1)
    {
        TCHAR szPath[MAX_PATH];
        if(SHGetPathFromIDList(pItem->pidlFQ, szPath))
        {
            CFileStatus fs;
            if(CFile::GetStatus(szPath, fs))
            {
                CString str;
                OnFormatFileDate(fs.m_ctime, str);
                return str;
            }
        }
    }
ランキングへ     posted by 遠雷 | Comment(0) | コントロール
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。