Сортировка с CListBox и редактирование

Я тут еще наткнулся на такую фишку в CListCtrl, если ставишь LVS_EDITLABELS в стиль, то позволяет редактировать, но только первый столбец. Я переписал процедуру поиска. Проверил работает, сортирует по убывающей по любому столбцу.

CMyListCtrl.ColumnSort=номер колонки для сортировки. первая с 0;
static int CALLBACK AlphabeticalOrder(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); 

static int CALLBACK AlphabeticalOrder(LPARAM lParam1, LPARAM lParam2,
            LPARAM lParamSort)
{
      CMyListCtrl* pListCtrl = (CMyListCtrl*) lParamSort;

	  LV_FINDINFO a1;
	  LV_FINDINFO a2;

	  a1.flags = LVFI_PARAM;	a2.flags = LVFI_PARAM;
	  a1.lParam=lParam1;		a2.lParam=lParam2;	

      CString strItem1 = pListCtrl->GetItemText(pListCtrl->FindItem(&a1,-1),pListCtrl->ColumnSort );
      CString strItem2 = pListCtrl->GetItemText(pListCtrl->FindItem(&a2,-1),pListCtrl->ColumnSort );

      return -strcmp(strItem1, strItem2);
 }

Cама функция сортировки. Красиво как получилось. Вызывается по нажатию на кнопку на диалоговом окне

void CTmp3Dlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	if (m_list.ColumnSort==0)
		m_list.ColumnSort++;
	else
		m_list.ColumnSort=0;
	// А как хочется написать if(,,)
	
	m_list.SortItems(AlphabeticalOrder,(LPARAM)&m_list);
}

В BOOL CTmp3Dlg::OnInitDialog() добавлены SetData()

BOOL CTmp3Dlg::OnInitDialog()
{
..................
//////////////////////////////////////////
//
//	Цвет для фона
	m_list.d1=RGB(255,255,0);
	m_list.d2=RGB(0,255,255);
//	Цвет для текста
	m_list.m_text1=RGB(0,255,255);
	m_list.m_text2=RGB(0,0,0);

//////////////////////////////////////////
//
//	Теперь изменение стиля окна проще репки.
//	почему в мелкомякгих этого не доделали??????
//	
//	Это вариант показывает, как рисовать строки с изменением цвета фона и шрифта 
//	через запись.  LVS_OWNERDRAWFIXED  - говорит, о том , что в режиме таблицы
//	будет использоваться, наша переопределенная функция.
//	
	m_list.SetStile(LVS_REPORT | LVS_OWNERDRAWFIXED |LVS_EDITLABELS    );
//
//	Это стандартный пример
//	m_list.SetStile(LVS_REPORT );
//
// Один из них надо выбрать.
// После смотрим 
//	void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
////////////////////////////////////////////////////////////
//  Создали два списка один для больших второй для маленьких иконок.
//	при желании это можно сделать тоже составной частью CMyListCtrl
	m_imageb.Create(32,32,TRUE,1,1);
	m_images.Create(16,16,TRUE,1,1);
//  добавили по иконке
	m_imageb.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
	m_images.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));

// Закрепили 	
	m_list.SetImageList(&m_imageb,LVSIL_NORMAL);
	m_list.SetImageList(&m_images,LVSIL_SMALL);
	

// Добавили две колонки
	m_list.InsertColumn(0,_T("ID"),LVCFMT_LEFT,100);
	m_list.InsertColumn(1,_T("Наименование"),LVCFMT_LEFT,120);

// Добавили записей
	m_list.InsertItem(0,"0");
	m_list.InsertItem(1,"1");
	m_list.InsertItem(2,"2");
	m_list.InsertItem(3,"3");
	m_list.SetItemText(3,1,"01");
	m_list.SetItemText(2,1,"11");
	m_list.SetItemText(1,1,"21");
	m_list.SetItemText(0,1,"31");
	m_list.SetItemData(0,0);
	m_list.SetItemData(1,1);
	m_list.SetItemData(2,2);
	m_list.SetItemData(3,3);
	m_list.ColumnSort=1;

	//Сортируем сначала по второму столбцу
	// TODO: Add extra initialization here
	return TRUE;  // return TRUE  unless you set the focus to a control
}

gif/30_1.gif (5996 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Moth - 02.08.2000