Сортировка с CListBox

Наибольший интерес к:

void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

эта Функция, по логике, должна была бы уже быть в комлекте:

void CMyListCtrl::SetStile(DWORD NewStile)

Логика проста. В диалог добаляем CListCtrl. Это можно сделать и через Wizard. После поключаем *.h и меняем в переменной класса CListCtrl на CMyListCtrl и все работает.

BOOL CTmp3Dlg::OnInitDialog()

Там все с коментариями. Часто задают вопрос про "неработающую" сортировку в CListCtrl. Тут есть два пути.

1. http://codeguru.earthweb.com/listview/index.shtml. Пример, как сортировку можно написать самому. Ручками.

2. Если разобраться, почему в функции типа

static int CALLBACK AlphabeticalOrder(LPARAM lParam1, LPARAM lParam2,
             LPARAM lParamSort)
  {
       // lParamSort contains a pointer to the list view control.
       // The lParam of an item is just its index.
       CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
       CString strItem1 = pListCtrl->GetItemText(lParam1, 0);
       CString strItem2 = pListCtrl->GetItemText(lParam2, 0);
 
       return strcmp(strItem1, strItem2);
  }

Значения lParam1 и lParam2 все время принимаю значения 0, то решение лежит на поверхности. Эти переменные содержат не номер как это часто пытаются использовать а.

 typedef struct _LVITEM
 
     UINT   mask;
     int    iItem;
     int    iSubItem;
     UINT   state;
     UINT   stateMask;
     LPTSTR  pszText;
     int    cchTextMax;
     int    iImage;
     LPARAM lParam; //<<<<<--- а вот этот  параметр.
 #if (_WIN32_IE >= 0x0300)
     int iIndent;
 #endif
 } LVITEM

Т.е. при дополнении записи, необходимо заполнять этот параметр. А этого не делают. А потом вопросы типа, оно не работает. Мелкомягкие плохие, они меня обидели и т.д. Это можно делать по разному.

Первый вариант

int InsertItem( const LV_ITEM* pItem );
int InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem,
	UINT nState, UINT  nStateMask, int nImage, LPARAM lParam );

Второй вариант

BOOL SetItem( const LV_ITEM* pItem );
BOOL SetItem( int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem,
	int  nImage, UINT nState, UINT nStateMask, LPARAM lParam );

Третий вариант

BOOL SetItemData( int nItem, DWORD dwData );

Где DWORD dwData это самое уникальное значение, типа BookMark.

gif/29_1.gif (3795 b)


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