MFC ListControl用法總結

本文轉自:http://blog.chinaunix.net/uid-26310563-id-3164303.html

1
、ListControl初始化
    ListControl初始化代碼添加在虛函數CDlgxxx::OnInitDialog()中:
m_MyList.ModifyStyle(0L,LVS_SHOWSELALWAYS);
DWORD dwStyle = m_MyList.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//選中某行使整行高亮(只適用與report風格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//網格線(只適用與report風格的listctrl)
// dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_MyList.SetExtendedStyle(dwStyle);
//設置列標題
m_MyList.InsertColumn(0,_T(""));
m_MyList.InsertColumn(1,_T("編號"),LVCFMT_CENCTER,80);
m_MyList.InsertColumn(2,_T("名稱"),LVCFMT_LEFT,100);
m_MyList.InsertColumn(3,_T("單價"),LVCFMT_RIGHT,80);
......
//InsertColumn第三個參數可設置爲LVCFMT_LEFT, LVCFMT_RIGHT, or LVCFMT_CENTER
//解決第一列始終靠左的問題
m_MyList.DeleteColumn(0);
2、在ListControl中插入數據
int nItem = m_datalist.GetItemCount();
//獲得列表行數
m_Mylist.InsertItem(nItem, _T("data"));
m_Mylist.SetItemText(nItem, 1, CString);
m_Mylist.SetItemText(nItem, 2, CString);
......
3、刪除選中項(包括多選)
void Dialogxxx::OnBnClickedDelete()
{
// TODO: Add your control notification handler code here
POSITION pos = m_Mylist.GetFirstSelectedItemPosition();
if (pos == NULL) {
AfxMessageBox(_T("No items were selected!\n"));
}
else {
while(pos) {
int nItem = m_Mylist.GetNextSelectedItem(pos);
m_Mylist.DeleteItem(nItem);
// you could do your own processing on nItem here
}
}
}
4、左鍵單擊消息響應函數
    給ListControl控件添加名爲NM_CLICK的消息響應函數
BEGIN_MESSAGE_MAP(CDlgxxx, CDialog)
ON_NOTIFY(NM_CLICK, IDC_LIST, &CDlgxxx::OnNMClickList)
END_MESSAGE_MAP()
    若編譯出錯在NMITEMACTIVATE後添加*
void CDlgxxx::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE*>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}
5、單擊列表頭實現按相應列排序
    從CListCtrl繼承一個新類CSortList
class CSortList : public CListCtrl
{
public:
CSortList();
~CSortList();
bool m_fAsc;
int m_nSortedCol;
};
CSortList::CSortList()
: CListCtrl()
{
m_fAsc = FALSE;
m_nSortedCol = 0;
}
CSortList::~CSortList()
{}
    在對話框類中爲CListCtrl控件添加成員變量
CSortList m_datalist;
    添加消息相應函數
afx_msg void OnLvnColumnclickDatalist(NMHDR *pNMHDR, LRESULT *pResult);
BEGIN_MESSAGE_MAP(Dialogxxx, CDialog)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_DATALIST, &DialogC10::OnLvnColumnclickDatalist)
END_MESSAGE_MAP()
void Dialogxxx::OnLvnColumnclickDatalist(NMHDR *pNMHDR, LRESULT *pResult)
{
// LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//爲排序設置唯一標示符??
for(int i = 0; i < m_datalist.GetItemCount(); ++i)
m_datalist.SetItemData(i,i);
if(pNMListView->iSubItem == m_datalist.m_nSortedCol) {
m_datalist.m_fAsc = !m_datalist.m_fAsc;
}
else {
m_datalist.m_nSortedCol = pNMListView->iSubItem;
m_datalist.m_fAsc = FALSE;
}
m_datalist.SortItems(MyCompareProc, (DWORD)&m_datalist);//調用排序處理函數MyCompareProc
*pResult = 0;
}
    添加相應處理函數
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 
// lParamSort   contains   a   pointer   to   the   list   view   control. 
// The   lParam   of   an   item   is   just   its   index.   
CSortList* pListCtrl = (CSortList*)lParamSort; 
CString strItem1 = pListCtrl->GetItemText(lParam1, pListCtrl->m_nSortedCol); 
CString strItem2 = pListCtrl->GetItemText(lParam2, pListCtrl->m_nSortedCol); 
    //比較兩個數
// LPCTSTR s1=(LPCTSTR)strItem1; 
// LPCTSTR s2=(LPCTSTR)strItem2; 
int n1 = _ttoi(strItem1); 
int n2 = _ttoi(strItem2);
if(pListCtrl->m_fAsc) 
return n1 > n2 ? 1 : -1; 
else 
return n1 < n2 ? 1 : -1;
}
發佈了286 篇原創文章 · 獲贊 57 · 訪問量 118萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章