1、禁止拖動表頭
重載OnNotify消息響應(yīng)函數(shù),屏蔽兩個消息通知碼:HDN_BEGINTRACKW 和HDN_DIVIDERDBLCLICKW。示例如下:
- BOOL CXXXX::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
- {
-
-
- NMHEADER* pNMHeader = (NMHEADER*)lParam;
- if(((pNMHeader->hdr.code == HDN_BEGINTRACKW) |
- (pNMHeader->hdr.code == HDN_DIVIDERDBLCLICKW)))
- {
- *pResult = TRUE;
- return TRUE;
- }
-
- return CDialog::OnNotify(wParam, lParam, pResult);
- }
2、虛擬列表技術(shù) 給一個鏈接,介紹的比較詳細:http://hi.baidu.com/qi_xian/blog/item/929b04ce27d02c0592457ef8.html
當(dāng)數(shù)據(jù)量大時,使用InsertItem插入數(shù)據(jù)的過程是很漫長的。這時我們有兩個方法來解決該問題:一是使用CListCtrl的虛擬列表技術(shù),二是采用分頁顯示的方法。對于虛擬列表技術(shù),上述鏈接中的文章講的很詳細,我用過它的比較簡單的方法,后來改用了分頁方法。
使用虛擬列表技術(shù),有三點需要搞清楚:
① 使用虛擬技術(shù)時,需要將CListCtrl控件的Owner Data屬性設(shè)置為ture。
② 給虛擬列表添加元素時,不需要使用InserItem函數(shù),通過調(diào)用SetItemCount設(shè)置數(shù)據(jù)總個數(shù),然后由系統(tǒng)產(chǎn)生不同的消息,在相應(yīng)的消息響應(yīng)函數(shù)中完成插入工作。
③ 虛擬列表向父窗口發(fā)送的消息有三種: ⑴ 當(dāng)它需要數(shù)據(jù)時,發(fā)送LVN_GETDISPINFO消息; ⑵ 當(dāng)用戶試圖查找某個元素時,發(fā)送LVN_ODFINDITEM消息; ⑶當(dāng)需要緩沖數(shù)據(jù)時,發(fā)送 LVN_ODCACHEHINT消息。
當(dāng)我們使用LVN_GETDISPINFO 的消息處理函數(shù)來插入元素時,必須首先檢查列表請求的是什么數(shù)據(jù)(如LVIF_TEXT、LVIF_IMAGE等),然后插入不同的子項。示例如下:
- void CDataAnalysis::OnLvnGetdispinfoAnalysisList(NMHDR *pNMHDR, LRESULT *pResult)
- {
- NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
-
- LV_ITEM* pItem= &(pDispInfo)->item;
- int iItemIndex= pItem->iItem;
- size_t converted = 0;
- wchar_t wStr[30];
- if (pItem->mask & LVIF_TEXT)
- {
- switch(pItem->iSubItem)
- {
- case 0:
- mbstowcs_s(&converted, wStr, 30, xxxxxx, _TRUNCATE);
- lstrcpy(pItem->pszText,wStr);
- break;
- case 1:
- mbstowcs_s(&converted, wStr, 30, xxxxxx, _TRUNCATE);
- lstrcpy(pItem->pszText,wStr);
- break;
- case 2:
- mbstowcs_s(&converted, wStr, 30, xxxxxx, _TRUNCATE);
- lstrcpy(pItem->pszText,wStr);
- break;
- case 3:
- lstrcpy(pItem->pszText,xxxxxx);
- break;
- }
- }
-
- *pResult = 0;
- }
3、點擊表頭時進行歸類排序
系統(tǒng)通過發(fā)送LVM_SORTITEMS消息來處理歸類問題,在該消息的處理函數(shù)中需要調(diào)用一個回調(diào)函數(shù),這個回調(diào)函數(shù)需要我們來設(shè)計,以完成不同的歸類方法?;卣{(diào)函數(shù)原型如下:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
針對上述回調(diào)函數(shù),有以下幾點需要搞清楚:
① 對于參數(shù)lparam1和lparam2,分別為CListCtrl的兩行數(shù)據(jù),是用于比較的對象。通過CListCtrl的成員函數(shù)SetItemData來設(shè)置,該函數(shù)原型:
int SetItemData(int nIndex, DWORD_PTR dwItemData )
其第一個參數(shù)為行號,第二個參數(shù)指明了該行對應(yīng)的參數(shù)。參數(shù)dwItemData 通常設(shè)為一行參數(shù)的數(shù)組,如: pData[2][2] = {{1, 3},{2, 3}}; 每次使用pData[i]作為dwItemData。
② 對于參數(shù)lParamSort,用于指明列項,即第幾列。該參數(shù)和回調(diào)函數(shù)一同通過CListCtrl的成員函數(shù)SortItems來設(shè)置,其函數(shù)原型為:
BOOL SortItems( PFNLVCOMPARE pfnCompare,DWORD_PTR dwData )
參數(shù) pfnCompare 為回調(diào)函數(shù)入口地址, 參數(shù)dwData 為列項。
③ SetItemData在初始插入數(shù)據(jù)時進行調(diào)用來設(shè)置,SortItems則在點擊列表頭時響應(yīng)的消息處理函數(shù)中進行設(shè)置。
示例如下:
-
- BOOL CDataAnalysis::InitListCtl()
- {
-
-
- for(int i=0; i<LineNum; i++)
- {
-
- mbstowcs_s(&converted, wStr, 30, m_analysis[i].Date, _TRUNCATE);
- m_listAnalysis.InsertItem(i, wStr);
- mbstowcs_s(&converted, wStr, 30, m_analysis[i].Time, _TRUNCATE);
- m_listAnalysis.SetItemText(i, 1, wStr);
- mbstowcs_s(&converted, wStr, 30, m_analysis[i].ID, _TRUNCATE);
- m_listAnalysis.SetItemText(i, 2, wStr);
- m_listAnalysis.SetItemText(i, 3, m_analysis[i].lpszEvent);
-
-
- m_listAnalysis.SetItemData(i, (LPARAM)(m_analysis+i));
- }
-
- return TRUE;
- }
- void CDataAnalysis::OnHdnItemclickAnalysisList(NMHDR *pNMHDR, LRESULT *pResult)
- {
- LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
-
-
-
- m_listAnalysis.SortItems(SortFunc, phdr->iItem);
-
- *pResult = 0;
- }
-
- int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
- {
- int result;
-
-
- ANALYSISFORMAT* pAnalysis1 = (ANALYSISFORMAT*)lParam1;
- ANALYSISFORMAT* pAnalysis2 = (ANALYSISFORMAT*)lParam2;
-
-
- switch(lParamSort)
- {
- case 0:
- result = strcmp(pAnalysis1->Date, pAnalysis2->Date);
- break;
- case 1:
- result = strcmp(pAnalysis1->Time, pAnalysis2->Time);
- break;
- case 2:
- result = strcmp(pAnalysis1->ID, pAnalysis2->ID);
- break;
- case 3:
- result = wcscmp(pAnalysis1->lpszEvent, pAnalysis2->lpszEvent);
- break;
- default:
- break;
- }
-
- return result;
- }
|