C++ ListView按错误列排序

C++ ListView按错误列排序,c++,c,sorting,listview,winapi,C++,C,Sorting,Listview,Winapi,在这个winapi程序中,我根据“日期”列对所有项目进行排序。但是,它是按“说明”列排序,而不是按“日期”列排序。 以下是WM_NOTIFY中的代码: static char szText[10]; NM_LISTVIEW *pNm = (NM_LISTVIEW *)lParam; switch (((LPNMHDR)lParam)->code) { case LVN_COLUMNCLICK: if (pNm->iSubItem == 2)

在这个winapi程序中,我根据“日期”列对所有项目进行排序。但是,它是按“说明”列排序,而不是按“日期”列排序。

以下是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\u 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;
    }
}
int回调CompareFunc(lparamlparam1、lparamlparam2、lparamlparamsort)
{
if(lParamSort==2){
日期d1,d2;//应用程序定义的“日期”类
字符b1[32],b2[32];
sscanf((字符*)lParam1,“%s%d%d”,b1,&d1.day,&d1.yr);
sscanf((字符*)lParam2、%s%d%d)、b2和d2.day和d2.yr);
d1.month=monthtoi(b1);//将月份作为字符串转换为数字
d2.月=月(b2);

如果(d1>d2)//重载“>”和“输入的
lParam1
lParam2
不是子项的字符串,而是与该项相关的数据:

lParam1参数是与第一个 正在比较的项;lParam2参数是关联的值 使用第二项。这些是在 插入项时项的LVITEM结构的lParam成员 进入名单

您可以找到完整的ListView排序示例,但其基本内容如下:

          // 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;
    ...

由于我们无法看到
monhtoi
或您的
操作员>
实现的实现,因此没有什么帮助。我们也无法看到您的
LVITEM
s。是否正确设置了
lParam
成员?更改了答案@IInspectable
          // 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;
    ...