ListView 按错误的列排序

ListView sorting by wrong column

在这个 winapi 程序中,我根据 "Date" 列对所有项目进行排序。但是,它按 "Description" 列而不是 "Date" 列排序。

这是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 returns 真,奇怪。 这是 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;
    }
}

我尝试根据 3 而不是 2(基于 1 与基于 0)检查 iSubItem,但这也不起作用。 我做错了什么?

编辑

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;
}

输入的 lParam1lParam2 不是子项目的字符串,但正如 documentation 所说的那样,它们是与项目关联的数据:

The lParam1 parameter is the 32-bit value associated with the first item being compared; and the lParam2 parameter is the value associated with the second item. These are the values that were specified in the lParam member of the items' LVITEM structure when they were inserted into the list.

您可以找到完整的 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;
    ...