リストコントロールアイテムのソートの仕方

twhs2008-01-13

void ClistCtrlSortTestDlg::PrepareListHeader()
{
	LVCOLUMN lvColumn;

	::memset(&lvColumn, 0, sizeof(LVCOLUMN));
	lvColumn.mask = LVCF_TEXT | LVCF_WIDTH;
	lvColumn.cx = 100;

	lvColumn.pszText = _T("num");
	m_numList.InsertColumn(0, &lvColumn);	
}

void ClistCtrlSortTestDlg::PrepareListCtrl()
{
	LVITEM lvItem;
	::memset(&lvItem, 0, sizeof(LVITEM));

#define BUF_SIZE 8
	int num;
	TCHAR buf[BUF_SIZE];

	lvItem.mask = LVIF_TEXT | LVIF_PARAM;
	lvItem.iSubItem = 0;
	for (int i = 0; i < 50; ++i) {
		lvItem.iItem = i;	
		num = rand();
		_stprintf_s(buf, BUF_SIZE, _T("%d"), num);
		lvItem.pszText = buf;
		lvItem.cchTextMax = BUF_SIZE;
		lvItem.lParam = (LPARAM)num;	// ここに値を設定
		m_numList.InsertItem(&lvItem);
	}
}

int CALLBACK CompProc(LPARAM lp1, LPARAM lp2, LPARAM lp3)
{
	if (lp1 < lp2) {
		return -1;	// lp1が前に来るようにしたいなら負を返す
	} else if (lp1 > lp2) {
		return 1;		// lp2が前に来るようにしたいなら負を返す
	} else {
		return 0;
	}
}

void ClistCtrlSortTestDlg::OnBnClickedBtnSort()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。

	m_numList.SortItems(CompProc, 0);
}