Шаг 279 - Класс CListBox, сортировка списка

Список может быть отсортирован, если у него установлен флаг сортировки и перегружена функция CompareItem().

279.gif (2662 b)

int CTestList::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct) 
{
	// TODO: Add your code to determine the sorting order of the specified items
	// return -1 = item 1 sorts before item 2
	// return 0 = item 1 and item 2 sort the same
	// return 1 = item 1 sorts after item 2
	
	return 0;
}

Если ставите sort, то перегружайте функцию, иначе получите сообщение об ошибке в ходе выполнения. Главное, что передается в этот список - это структура COMPAREITEMSTRUCT.

typedef struct tagCOMPAREITEMSTRUCT {
	UINT   CtlType;
	UINT   CtlID;
	HWND   hwndItem;
	UINT   itemID1;		// индекс первого элемента в списке
	DWORD  itemData1;		// данные первого элемента
	UINT   itemID2;		// индекс второго сравниваемого элемента
	DWORD  itemData2;		// данные второго сравниваемого элемента
} COMPAREITEMSTRUCT;

Давайте попробуем отсортировать наш список стран по первой букве:

int CTestList::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct) 
{
	CString s1=(LPSTR)lpCompareItemStruct->itemData1; 
	CString s2=(LPSTR)lpCompareItemStruct->temData2;
	char c1=s1[0];
	char c2=s2[0];
	if (c1>=c2) return 1;
	else return -1;
}

В обратном порядке будет наоборот:

if (c1<c2) return 1;
else return -1;

Список станет таким:

ЯПОНИЯ
США
РОССИЯ
КАНАДА

А вообще-то условия можно давать и значительно сложнее. Например, сортировать по площади, которую можно брать из базы данных.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 13.11.2000