Hej
Jag håller på att göra ett program i Win32 utan MFC osv och jag vill sortera lite saker som jag har lagt in i en list control (report view). Problemet nu är att min compare funktion anroppas och körs men listan är ändå inte sorterad utan ser likadan som innan jag begärde en sortering.
Här är koden för sorteringen,
void OnNotify(WPARAM wParam, LPARAM lParam)
{
if(wParam==IDC_LIST_PROGRAM_KEYSTROKE)
{
LV_DISPINFO *pLvdi=(LV_DISPINFO*)lParam;
NM_LISTVIEW *pNm=(NM_LISTVIEW*)lParam;
switch(pLvdi->hdr.code)
{
case LVN_COLUMNCLICK:
{
ListView_SortItems(pNm->hdr.hwndFrom,CompareFunc,(LPARAM)(pNm->iSubItem));
break;
}
}
}
}
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
ItemData *Data1=(ItemData*)lParam1;
ItemData *Data2=(ItemData*)lParam2;
int iResult=0;
if(lParamSort==0)
iResult=lstrcmpi(Data1->Name,Data2->Name);
else
iResult=Data2->Keys-Data1->Keys;
return(iResult);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NOTIFY:
OnNotify(wParam,lParam);
...
}
och här är kod som jag använder för att lägga in mina items,
void UpdateList()
{
char *Temp=NULL;
ItemData *pItemData=NULL;
int i=0;
map<string,int> keys=m_Counter.GetMap();
map<string,int>::iterator iter;
// Clear all items
SendMessage(m_hList,LVM_DELETEALLITEMS,0,0);
for(iter=keys.begin();iter!=keys.end();iter++)
{
pItemData=new ItemData();
Temp=new char[_MAX_DIR];
sprintf(Temp,"%s",iter->first.substr(iter->first.find_last_of('\\')+1).c_str());
pItemData->Keys=iter->second;
pItemData->Name=Temp;
AddItem(Temp,i,0,pItemData);
Temp=new char[_MAX_DIR];
sprintf(Temp,"%d",iter->second);
AddItem(Temp,i++,1);
}
}
bool AddItem(char *Name, int Item, int SubItem, ItemData *pItemData)
{
LVITEM LvItem;
memset(&LvItem,0,sizeof(LvItem));
if(SubItem==0)
LvItem.mask=LVIF_TEXT|LVIF_PARAM;
else
LvItem.mask=LVIF_TEXT;
LvItem.cchTextMax=256;
LvItem.pszText=Name;
LvItem.lParam=(LPARAM)pItemData;
LvItem.iItem=Item;
LvItem.iSubItem=SubItem;
if(SubItem==0)
SendMessage(m_hList,LVM_INSERTITEM,0,(LPARAM)&LvItem);
else
SendMessage(m_hList,LVM_SETITEM,0,(LPARAM)&LvItem);
return(true);
}
/Viktor