天天看點

list control單擊清單頭排序(MFC)

    MFC的路上荊棘還真不少,單擊清單頭排序就是!!!由于網上的資源都太老了而且食用說明也沒有,對于初級食客來說很不友好,為此本大廚決定寫一篇食用說明,本說明無毒無害不可食用

list control單擊清單頭排序(MFC)
list control單擊清單頭排序(MFC)

環境:VS2005

首先要建立list control控件,如果你連list control都不會建立,那就太吓人了

然後,在.cpp檔案裡面先定義兩個全局變量

DWORD  dwSelColID =0; //選擇的列
BOOL   bASC = FALSE;     //是否升序
           

然後建立list control的單擊事件:OnLvnColumnclick****

void CMy528Update_MfcDlg::OnLvnColumnclickList3(NMHDR *pNMHDR, LRESULT *pResult)//***********************單擊表頭實作排序
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	

	if (dwSelColID != pNMLV->iSubItem)
	{
		dwSelColID = pNMLV->iSubItem;
		bASC = bASC;
	}
	else
		bASC = !bASC;
	int count = m_list3.GetItemCount();
	for (int i = 0;i < count;i++)
		m_list3.SetItemData(i,i);
	m_list3.SortItems(CompareFunc,(LPARAM)(&m_list3));
	*pResult = 0;
}
           

這段代碼裡m_list3是我list control的名字,自己看情況修改 

CompareFunc
           

是回調函數,裡面放的是排序方法(其實應該把回調函數放上邊的)

static int CALLBACK CompareFunc(LPARAM   lParam1,   LPARAM   lParam2,LPARAM   lParamSort)
{
	CListCtrl *pListCtrl = (CListCtrl *)lParamSort;//{這裡面都是固定文法,适當了解
	LVFINDINFO findInfo;
	findInfo.flags = LVFI_PARAM;
	findInfo.lParam = lParam1;
	int iItem1 = pListCtrl->FindItem(&findInfo,-1);
	findInfo.lParam = lParam2;
	int iItem2 = pListCtrl->FindItem(&findInfo,-1);//這裡面都是固定文法,适當了解}

	CString strItem1 = pListCtrl->GetItemText(iItem1, dwSelColID);   //需要研究
	CString strItem2 = pListCtrl->GetItemText(iItem2, dwSelColID);   //需要研究
	char * str1 =(char * )strItem1.GetBuffer(strItem1.GetLength());  //需要研究
	char * str2 =(char * )strItem2.GetBuffer(strItem1.GetLength());  //需要研究
	

	if (bASC)
		return strcmp(str1,str2);
	else
		return strcmp(str2,str1);

}
           

到這裡就結束了,下面我示範下

list control單擊清單頭排序(MFC)

這是我做的界面,一開始記錄是沒有排序的,我單擊id清單

list control單擊清單頭排序(MFC)

這是升序,再次單擊(左擊)

list control單擊清單頭排序(MFC)

實作逆序

上面的食用方法希望可以幫到你.