ListView_SortItems Vergleichsfunktion :: bin am verzweifeln!



  • Hallo, ich verwende sehr oft die ListView und zu ihr gehört einfach, dass man die Items auch sortieren kann. Soweit bin ich gekommen:

    // SONSTIGES
    
    typedef struct _tagSORTDATA{
        HWND hwndList;
        int isortSubItem;
        int iUPDOWN;
    } SORTDATA;
    
    int CALLBACK MyCompProc(LPARAM, LPARAM, LPARAM);
    
    #define NO_OF_SUBITEM 3
    
    SORTDATA SortData;
        static int sortsubno[NO_OF_SUBITEM] = {DOWN};
        static int isortsubno;
    
    // VERGLEICHSFUNKTIONFUNKTION
    
    int CALLBACK MyCompProc(LPARAM lp1, LPARAM lp2, LPARAM lp3)
    {
        static LVFINDINFO lvf;
        static int nItem1, nItem2;
        static char buf1[MAX_PATH], buf2[MAX_PATH];
        SORTDATA *lpsd;
    
        lpsd = (SORTDATA *)lp3;
    
        lvf.flags = LVFI_PARAM;
        lvf.lParam = lp1;
        nItem1 = ListView_FindItem(lpsd->hwndList, -1, &lvf);
    
        lvf.lParam = lp2;
        nItem2 = ListView_FindItem(lpsd->hwndList, -1, &lvf);
    
        ListView_GetItemText(lpsd->hwndList, nItem1, lpsd->isortSubItem, buf1, sizeof(buf1));
    
        ListView_GetItemText(lpsd->hwndList, nItem2, lpsd->isortSubItem, buf2, sizeof(buf2));
        if(lpsd->iUPDOWN == UP)
            return(stricmp(buf1, buf2));
        else
            return(stricmp(buf1, buf2) * -1);
    }
    
    // COLUMNKLICK ABFRAGEN
    
    case WM_NOTIFY:
            {
                if(wParam == IDC_LISTVIEWCTRL1)
                {
                    NMLISTVIEW *lpnmlistview;
                    lpnmlistview = (LPNMLISTVIEW)lParam;
                    if(lpnmlistview->hdr.code == LVN_COLUMNCLICK)
                    {
                        isortsubno = lpnmlistview->iSubItem;
                        if (sortsubno[isortsubno] == UP)
                            sortsubno[isortsubno] = DOWN;
                        else
                            sortsubno[isortsubno] = UP;
                        SortData.hwndList = GetDlgItem(hChild1, IDC_LISTVIEWCTRL1);
                        SortData.isortSubItem = isortsubno;
                        SortData.iUPDOWN = sortsubno[isortsubno];
                        if(ListView_SortItemsEx(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1), MyCompProc, &SortData) != TRUE)
                            MessageBox(hMainWnd, "?????", "Error", MB_OK);
                    }
                    if(lpnmlistview->hdr.code == NM_DBLCLK)
                        if(ListView_GetItemCount(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1)) != 0)
                            SendMessage(hMainWnd, WM_COMMAND, (WPARAM)ID_MAINMENU_PLAY, (LPARAM)0l);
                    if(lpnmlistview->hdr.code == NM_RCLICK)
                        if(ListView_GetItemCount(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1)) != 0)
                            PopupMenu(MPM_CHILD1LISTVIEWMENU);
                }
                break;
            }
    

    Zwar tut sich immer irgendwas, wenn man auf die Columns klickt, allerdings tut es das nicht richtig. Sie werden immer wild durcheinander geschoben, meine Frage ist, warum und was ich falsch mache! 😞 Ich suche das sowas von lange wie das geht, ich bekomms nie hin und nie kann mir jemand genau aufklären... Die MSDN erstrecht nicht.

    😞

    Aber vielleicht weiß es eienr von Euch :-)))

    Tschüss
    Chris



  • Ohne das jetzt bis ins Letzte untersucht zu haben:
    Du rufst ListView_SortItemsEx() auf, verwendest aber die CompareFunc, die zu ListView_SortItems gehört. Du mußt entweder die CompareFunc anpassen oder ListView_SortItems() anstelle von ListView_SortItemsdEx() aufrufen.



  • Argh! Wie peinlich. Es geht tatsächlich! *schähm*. Mist echt sorry, wenn ich jetzt wegen sowas diese Frage gestellt habe. Danke KING, scheint, als ob du API net schlecht drauf hättest. *hehe* 😃


Anmelden zum Antworten