標籤:
1\在開發項目時,使用到了 listcontrol 控制項,就一些問題,做一下備忘,以備以後使用
(1) 給list項目 刪除所有的項目 DeleteAllItems();
(2) 給list項目 添加一個列 .InsertColumn(0, _T("編號"));
(3)給list a項目 設定列的寬度 .SetColumnWidth(0, 50);
(4) 在添加項目之前 可以使用 .SetRedraw(false); 來禁止 重畫,這樣可以提高效率.當添加完成後,可以 使用 .SetRedraw(true); 重新啟用重畫
(5) 添加項目: m_List_IpList.InsertItem(3, _T("4"), 3);
第1個參數是 行數, 如果放在第0行,就寫為0 .這裡的號必須是一個合理的號,不合理的號,會出現錯誤
第2個參數是 行的標題
第3個參數是 對應的 顯示表徵圖 號,後面會講到,如果不使用,就設定為 -1
(6)對於非 report項目來講,第 (5)條就可以了,但是對於 Report 樣式,還需要添加一些其它列的資訊,可以使用 SetItemText(0, 1, _T("192.168.1.4")); 來添加其它的內容
(7) 可以使用 SetItemData() 來在對應的行中,儲存一些重要的資料資訊.用於程式處理
(8) 關於行高的調整 調整行高的方法有多個,但是建議使用Cimagelist 來調節
設定CListCtrl的行高沒有函數介面,可以通過自繪來實現,但是比較麻煩。有一個比較簡單的方法是通過使用一個空白的映像將行撐起來,使其高度發生變化。樣本如下:
例如:
CImageList m_image; m_image.Create(1,24,ILC_COLOR32,1,0); m_listInfo.SetImageList(&m_image, LVSIL_SMALL);
(9 ) 對於字型的設定,我們可以使用SetFont函數來實現。以修改CListView的字型為例,在OnInitialUpdate函數中插入列之前調用SetFontSelf函數(該函數自訂,如下樣本所示)。首先建立一個字型,然後調用SetFont進行設定。需要注意的是,在退出時需要delete 掉建立的字型,避免記憶體泄露。
//設定字型和大小void CMyListView::SetFontSelf(int nHeight, LPCTSTR lpszFacename){ //先刪除原有字型 if(m_font != NULL) delete m_font; m_font = new CFont; //建立字型 m_font->CreateFont( nHeight, // nHeight 0, // nWidth 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut ANSI_CHARSET, // nCharSet OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily lpszFacename); // lpszFacename //設定字型 CListCtrl &theCtrl = GetListCtrl(); //擷取控制權,引用變數 theCtrl.SetFont(m_font, TRUE);}
(10) 點擊表頭時進行歸類排序
系統通過發送
LVM_SORTITEMS訊息來處理歸類問題,在該訊息的處理函數中需要調用一個
回呼函數,這個回呼函數需要我們來設計,以完成不同的歸類方法。回呼函數原型如下:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
針對上述回呼函數,有以下幾點需要搞清楚:
① 對於參數lparam1和lparam2,分別為CListCtrl的兩行資料,是用於比較的對象。通過CListCtrl的成員函數SetItemData來設定,該函數原型:
int SetItemData(int nIndex, DWORD_PTR dwItemData )
其第一個參數為行號,第二個參數指明了該行對應的參數。參數dwItemData 通常設為一行參數的數組,如: pData[2][2] = {{1, 3},{2, 3}}; 每次使用pData[i]作為dwItemData。
② 對於參數lParamSort,用於指明列項,即第幾列。該參數和回呼函數一同通過CListCtrl的成員函數SortItems來設定,其函數原型為:
BOOL SortItems( PFNLVCOMPARE pfnCompare,DWORD_PTR dwData )
參數 pfnCompare 為回呼函數入口地址, 參數dwData 為列項。
③ SetItemData在初始插入資料時進行調用來設定,SortItems則在點擊列表頭時響應的訊息處理函數中進行設定。
樣本如下:
//初始化列表視圖控制項BOOL CDataAnalysis::InitListCtl(){ //其他處理,包括設定風格,插入列等等 //插入行 for(int i=0; i<LineNum; i++) { //要將char*轉換為wchar_t* 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); //ID 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); // TODO: Add your control notification handler code here //設定回呼函數的參數和入口地址 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: //ID result = strcmp(pAnalysis1->ID, pAnalysis2->ID); break; case 3: //事件 result = wcscmp(pAnalysis1->lpszEvent, pAnalysis2->lpszEvent); break; default: break; } return result;}
關於如何使用表徵圖的方法
需要首先將 list control 控制項綁定一個 imagelist 項目
方法如下
CImageList m_image;m_image.Create(IDB_IP_BITMAP, 16, 1, RGB(255, 255, 0));
m_List_IpList.SetImageList(&m_image, LVSIL_SMALL);m_image.Detach(); //這一句話 非常的重要,如果沒有這句話, 表徵圖不會顯示
前兩句的意思就是 建立一個 CImagelist 項目
其中 第二句 在VB6.0上 可能不存在, 在 VS2012中 可以使用
就是直接載入 位元影像資源到 圖象列表
在將圖象列表綁定到需要顯示的項目後, 要執行一次 Detach() 函數
目的: 調用此功能分離映像列表從 CImageList 對象。
其它重要的功能,可以參考以下網址:
http://blog.csdn.net/zwgdft/article/details/7565331
-----------------------------------
C++ 關於MFC List Control 控制項的使用事項 原創