単純に「SetColumnOrderArray」を使って並び替え、要らない列を削除すれば出来るのですが、ここでは別の方法を紹介します。
まず、前回紹介した方法でカラム名を変更します。
今回は、1列目に「ファイル名」、2列目に「更新日時」を表示させていきます。
ちなみに、列の並び替えをせず、間の2・3列目を削除して上記の並び順にした場合、最初はきちんと表示されますが、階層を変えるなどした場合、当然ですが違うアイテムが入ります。
そこで、リストにアイテムを入れるときに好みの列に入れるように改良します。
方法は、「CMFCShellListCtrl」クラスを派生させ(ここでは「CMyMFCShellListCtrl」)、仮想関数「OnGetItemText」をオーバライドし、そこで入れる列を変更させます。
ヘッダファイル上記の様にコードはすごく簡単ですが、ここでちょっと説明すると、列を指定する「iColumn」が、今回変更する「更新日時」の"3"のときだけ、変更先である"1"にして呼び出すようにし、その他のときはそのまま呼び出すようにしてあります。
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);
}
この方法と同様に、違う列の内容を別の列に入れたい場合にも使えます。
その他に、特定の列に独自の項目を入れたい場合も、ここで処理すればいろいろ改良することが出来ます。
例えば、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;
}
}
}