2
在這個winapi程序中,我基於「日期」列對所有項目進行排序。但是,它是通過「描述」列而不是「日期」列進行排序的。 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-基於VS從0開始),但也不能工作。 我在做什麼錯?
編輯:
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;
}
既然我們不能看到'monthtoi'實施或你的'運營商>'執行,幾乎沒有有助於預期。我們也看不到你的'LVITEM's。 lParam'成員是否正確設置? – IInspectable
更改了答案@IInspectable – stackptr