Я тут еще наткнулся на такую фишку в 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 }