C++ 關(guān)于MFC List Control 控件的總結(jié)
1\在開(kāi)發(fā)項(xiàng)目時(shí),使用到了 listcontrol 控件,就一些問(wèn)題,做一下備注,以備以后使用
(1) 給list項(xiàng)目 刪除所有的項(xiàng)目 DeleteAllItems();
(2) 給list項(xiàng)目 添加一個(gè)列 .InsertColumn(0, _T("編號(hào)"));
(3)給list a項(xiàng)目 設(shè)置列的寬度 .SetColumnWidth(0, 50);
(4) 在添加項(xiàng)目之前 可以使用 .SetRedraw(false); 來(lái)禁止 重畫(huà),這樣可以提高效率.當(dāng)添加完成后,可以 使用 .SetRedraw(true); 重新啟用重畫(huà)
(5) 添加項(xiàng)目: m_List_IpList.InsertItem(3, _T("4"), 3);
第1個(gè)參數(shù)是 行數(shù), 如果放在第0行,就寫(xiě)為0 .這里的號(hào)必須是一個(gè)合理的號(hào),不合理的號(hào),會(huì)出現(xiàn)錯(cuò)誤
第2個(gè)參數(shù)是 行的標(biāo)題
第3個(gè)參數(shù)是 對(duì)應(yīng)的 顯示圖標(biāo) 號(hào),后面會(huì)講到,如果不使用,就設(shè)置為 -1
(6)對(duì)于非 report項(xiàng)目來(lái)講,第 (5)條就可以了,但是對(duì)于 Report 樣式,還需要添加一些其它列的信息,可以使用 SetItemText(0, 1, _T("192.168.1.4")); 來(lái)添加其它的內(nèi)容
(7) 可以使用 SetItemData() 來(lái)在對(duì)應(yīng)的行中,保存一些重要的數(shù)據(jù)信息.用于程序處理
(8) 關(guān)于行高的調(diào)整 調(diào)整行高的方法有多個(gè),但是建議使用Cimagelist 來(lái)調(diào)節(jié)
設(shè)置CListCtrl的行高沒(méi)有函數(shù)接口,可以通過(guò)自繪來(lái)實(shí)現(xiàn),但是比較麻煩。有一個(gè)比較簡(jiǎn)單的方法是通過(guò)使用一個(gè)空白的圖像將行撐起來(lái),使其高度發(fā)生變化。示例如下:
例如:
CImageList m_image; m_image.Create(1,24,ILC_COLOR32,1,0); m_listInfo.SetImageList(&m_image, LVSIL_SMALL);
(9 ) 對(duì)于字體的設(shè)置,我們可以使用SetFont函數(shù)來(lái)實(shí)現(xiàn)。以修改CListView的字體為例,在OnInitialUpdate函數(shù)中插入列之前調(diào)用SetFontSelf函數(shù)(該函數(shù)自定義,如下示例所示)。首先創(chuàng)建一個(gè)字體,然后調(diào)用SetFont進(jìn)行設(shè)置。需要注意的是,在退出時(shí)需要delete 掉創(chuàng)建的字體,避免內(nèi)存泄露。
//設(shè)置字體和大小 void CMyListView::SetFontSelf(int nHeight, LPCTSTR lpszFacename) { //先刪除原有字體 if(m_font != NULL) delete m_font; m_font = new CFont; //創(chuàng)建字體 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 //設(shè)置字體 CListCtrl &theCtrl = GetListCtrl(); //獲取控制權(quán),引用變量 theCtrl.SetFont(m_font, TRUE); }
(10) 點(diǎn)擊表頭時(shí)進(jìn)行歸類排序
系統(tǒng)通過(guò)發(fā)送LVM_SORTITEMS消息來(lái)處理歸類問(wèn)題,在該消息的處理函數(shù)中需要調(diào)用一個(gè)回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)需要我們來(lái)設(shè)計(jì),以完成不同的歸類方法?;卣{(diào)函數(shù)原型如下:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
針對(duì)上述回調(diào)函數(shù),有以下幾點(diǎn)需要搞清楚:
① 對(duì)于參數(shù)lparam1和lparam2,分別為CListCtrl的兩行數(shù)據(jù),是用于比較的對(duì)象。通過(guò)CListCtrl的成員函數(shù)SetItemData來(lái)設(shè)置,該函數(shù)原型:
int SetItemData(int nIndex, DWORD_PTR dwItemData )
其第一個(gè)參數(shù)為行號(hào),第二個(gè)參數(shù)指明了該行對(duì)應(yīng)的參數(shù)。參數(shù)dwItemData 通常設(shè)為一行參數(shù)的數(shù)組,如: pData[2][2] = {{1, 3},{2, 3}}; 每次使用pData[i]作為dwItemData。
② 對(duì)于參數(shù)lParamSort,用于指明列項(xiàng),即第幾列。該參數(shù)和回調(diào)函數(shù)一同通過(guò)CListCtrl的成員函數(shù)SortItems來(lái)設(shè)置,其函數(shù)原型為:
BOOL SortItems( PFNLVCOMPARE pfnCompare,DWORD_PTR dwData )
參數(shù) pfnCompare 為回調(diào)函數(shù)入口地址, 參數(shù)dwData 為列項(xiàng)。
③ SetItemData在初始插入數(shù)據(jù)時(shí)進(jìn)行調(diào)用來(lái)設(shè)置,SortItems則在點(diǎn)擊列表頭時(shí)響應(yīng)的消息處理函數(shù)中進(jìn)行設(shè)置。
示例如下:
//初始化列表視圖控件 BOOL CDataAnalysis::InitListCtl() { //其他處理,包括設(shè)置風(fēng)格,插入列等等 //插入行 for(int i=0; i<LineNum; i++) { //要將char*轉(zhuǎn)換為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); //時(shí)間 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); //事件 //設(shè)置回調(diào)函數(shù)的參數(shù) 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 //設(shè)置回調(diào)函數(shù)的參數(shù)和入口地址 m_listAnalysis.SortItems(SortFunc, phdr->iItem); *pResult = 0; } //排序的回調(diào)函數(shù) int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { int result; //返回值 //兩行的參數(shù),用于比較 ANALYSISFORMAT* pAnalysis1 = (ANALYSISFORMAT*)lParam1; ANALYSISFORMAT* pAnalysis2 = (ANALYSISFORMAT*)lParam2; //排序 switch(lParamSort) { case 0: //日期 result = strcmp(pAnalysis1->Date, pAnalysis2->Date); break; case 1: //時(shí)間 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; }
關(guān)于如何使用圖標(biāo)的方法
需要首先將 list control 控件綁定一個(gè) imagelist 項(xiàng)目
方法如下
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(); //這一句話 非常的重要,如果沒(méi)有這句話, 圖標(biāo)不會(huì)顯示
前兩句的意思就是 建立一個(gè) CImagelist 項(xiàng)目
其中 第二句 在VB6.0上 可能不存在, 在 VS2012中 可以使用
就是直接加載 位圖資源到 圖象列表
在將圖象列表綁定到需要顯示的項(xiàng)目后, 要執(zhí)行一次 Detach() 函數(shù)
目的: 調(diào)用此功能分離圖像列表從 CImageList 對(duì)象。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
C++計(jì)算整數(shù)序列的最長(zhǎng)遞增子序列的長(zhǎng)度操作
這篇文章主要介紹了C++計(jì)算整數(shù)序列的最長(zhǎng)遞增子序列的長(zhǎng)度操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12C++ Template 基礎(chǔ)篇(一):函數(shù)模板詳解
這篇文章主要介紹了C++ Template函數(shù)模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04DSP中浮點(diǎn)轉(zhuǎn)定點(diǎn)運(yùn)算--定點(diǎn)數(shù)的加減乘除運(yùn)算
本文主要介紹DSP中定點(diǎn)數(shù)的加減乘除運(yùn)算,很值得學(xué)習(xí)一下,需要的朋友可以參考一下。2016-06-06OpenCV基于背景減除實(shí)現(xiàn)行人計(jì)數(shù)
本文主要介紹了如何使用OpenCV C++對(duì)視頻中的人流量進(jìn)行統(tǒng)計(jì)。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,需要的可以了解一下2022-01-01C語(yǔ)言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)ATM機(jī)存取款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11