2015-05-02 3 views
2

В этой программе winapi я сортирую все элементы на основе столбца «Дата». Однако он сортируется по столбцу «Описание» вместо столбца «Дата». This is how my listview looksСортировка ListView по неправильному столбцу

Вот код в WM_NOTIFY:

static char szText[10]; 
NM_LISTVIEW *pNm = (NM_LISTVIEW *)lParam; 

switch (((LPNMHDR)lParam)->code) { 
    case LVN_COLUMNCLICK: 
     if (pNm->iSubItem == 2) 
      if (ListView_SortItems(pNm->hdr.hwndFrom, CompareFunc, 
           (LPARAM) (pNm->iSubItem)) == FALSE) 
       MessageBox(hwnd, "FALSE", "", MB_OK); 
     break; 
/* other WM_NOTIFY code */ 
} 

ListView_SortItems возвращает TRUE, странно. Вот функция CompareFunc:

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
{ 
    if (lParamSort == 2) { 
     date d1, d2;    // app-defined "date" class 
     char b1[32], b2[32]; 

     sscanf((char *) lParam1, "%s %d %d", b1, &d1.day, &d1.yr); 
     sscanf((char *) lParam2, "%s %d %d", b2, &d2.day, &d2.yr); 

     d1.month = monthtoi(b1); // converts month as string to number 
     d2.month = monthtoi(b2); 

     if (d1 > d2)    // overloading the ">" and "<" operators 
      return 1; 
     else if (d1 < d2) 
      return -1; 
     return 0; 
    } 
} 

Я попытался проверить iSubItem против 3, а не 2 (1 на основе против 0 на основе), но это не сработало. Что я делаю неправильно?

Edit:

int monthtoi(char *s) 
{ 
    int i; 

    for (i = 0; i < 12; ++i) { 
     // MONTHS is a global array of char *, containing the months 
     if (strcmp(MONTHS[i], s) == 0) 
      return i; 
    } 
    return -1; 
} 
bool date::operator>(const date &x) 
{ 
    switch (this->cmp(x)) { // cmp is a private member function 
    case 0: 
    case -1: 
     return false; 
    case 1: 
     return true; 
    } 
    return false; 
} 
bool date::operator<(const date &x) 
{ 
    switch (this->cmp(x)) { 
    case 0: 
    case 1: 
     return false; 
    case -1: 
     return true; 
    } 
    return false; 
} 
int date::cmp(const date &x) 
{ 
    if (this->yr > x.yr) 
     return 1; 
    else if (this->yr < x.yr) 
     return -1; 

    if (this->yr == x.yr) { 
     if (this->month > x.month) 
      return 1; 
     else if (this->month < x.month) 
      return -1; 
     else if (this->day > x.day) 
      return 1; 
     else if (this->day < x.day) 
      return -1; 
     else 
      return 0; 
    } 
    return 0; 
} 
+0

Поскольку мы не можем увидеть реализацию 'monthtoi' или ваш' оператор> 'реализацию, есть немного можно ожидать. Мы также не можем видеть ваши «LVITEM». Правильно ли настроены члены 'lParam'? – IInspectable

+0

Изменен ответ @Inpectable – stackptr

ответ

2

вход lParam1 и lParam2 не строка подпункта а как documentation говорит, что они являются данные, связанные с элементом:

Параметр lParam1 - это 32-битное значение, связанное с первым сравниваемым элементом ; а параметр lParam2 - это значение, связанное с со вторым элементом. Это значения, которые были указаны в члене lParam структуры элементов LVITEM, когда они были вставлены в список.

Вы можете найти полный ListView сортировки пример here но основы этого являются следующие:

  // Custom type storing the item's information, or a link to it 
struct myitemdata_t 
{ 
    char* pFood; 
    char* pDescription; 
    date Date; 
    ... 
}; 

    // When adding items to a listview set the item data 
m_ctlListView.InsertItem(i, "food"); 
m_ctlListView.SetItemText(i, 1, "Saturday shopping"); 
... 
    // Set the item data for the list item 
m_ctlListView.SetItemData(i, (LPARAM) GetItemData(i)); 

    // Your sort function should look like 
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
{ 
    myitemdata_t* pData1 = (myitemdata_t *)lParam1; 
    myitemdata_t* pData2 = (myitemdata_t *)lParam2; 
    ... 
Смежные вопросы