// sortparam.h ----------------------------------------------------------------
class CSortParameter
{
public:
CSortParameter() {
m_bSort = TRUE;
}
virtual ~CSortParameter();
BOOL m_bSort; //!< 昇順降順のフラグ
int m_nIndex; //!< ソートするIndexの番号
};
// dlllistdlg.h
CDllListDlg に以下を追加
static int CALLBACK CompareData(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
CSortParameter m_sortParam; //! ソートの方法を指定する
// dlllistdlg.cpp--------------------------------------------------------------
//CDllListDlg::OnInitDialog()にて----------------------------------------------------------------------------
for (int i=0; i<pApp->m_pluginsInfo.size(); i++) {
m_dllList.InsertItem(LVIF_TEXT | LVIF_PARAM, i, pApp->m_pluginsInfo.at(i).filename,
0, 0, 0, (LPARAM)&(pApp->m_pluginsInfo[i]));
m_dllList.SetItem(i, 1, LVIF_TEXT, pApp->m_pluginsInfo[i].supportedTypes, 0, 0, 0, 0);
m_dllList.SetItem(i, 2, LVIF_TEXT, pApp->m_pluginsInfo[i].filetime, 0, 0, 0, 0);
}
/**************************************************************************//**
@par 説明
2つの値を比較する。
@param lParam1 入力値1
@param lParam2 入力値2
@param lParamSort 関数内部で任意に使えるvoidポインタ
*1113878543*//***************************************************************************/
int CDllListDlg::CompareData(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int result = 0;
PluginInfo* d1 = (PluginInfo*)lParam1;
PluginInfo* d2 = (PluginInfo*)lParam2;
CSortParameter* sortParam = (CSortParameter*)lParamSort;
if (sortParam->m_nIndex == 0) {
result = strcmp(d1->filename, d2->filename);
}
else if (sortParam->m_nIndex == 1) {
result = strcmp(d1->supportedTypes, d2->supportedTypes);
}
else if (sortParam->m_nIndex == 2) {
result = strcmp(d1->filetime, d2->filetime);
}
if (sortParam->m_bSort) {
result *= -1;
}
return result;
}
/**************************************************************************//**
@brief リストのヘッダをクリックしたとき呼ばれる。
@par 説明
リストのヘッダをクリックしたとき呼ばれる。
リストのアイテムをソートする。
@param pNMHDR クリックされたヘッダの情報
@param pResult よくわからない
*1113878544*//***************************************************************************/
void CDllListDlg::OnColumnclickList3(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
// 何列目がクリックされたか取得
m_sortParam.m_nIndex = pNMListView->iSubItem;
// ソートを行う
m_dllList.SortItems(CompareData, (DWORD)&m_sortParam);
// 次回は昇順・降順を逆にする
m_sortParam.m_bSort = !m_sortParam.m_bSort;
*pResult = 0;
}