C++ 關(guān)于MFC List Control 控件的總結(jié)
1\在開發(fā)項目時,使用到了 listcontrol 控件,就一些問題,做一下備注,以備以后使用
(1) 給list項目 刪除所有的項目 DeleteAllItems();
(2) 給list項目 添加一個列 .InsertColumn(0, _T("編號"));
(3)給list a項目 設(shè)置列的寬度 .SetColumnWidth(0, 50);
(4) 在添加項目之前 可以使用 .SetRedraw(false); 來禁止 重畫,這樣可以提高效率.當添加完成后,可以 使用 .SetRedraw(true); 重新啟用重畫
(5) 添加項目: m_List_IpList.InsertItem(3, _T("4"), 3);
第1個參數(shù)是 行數(shù), 如果放在第0行,就寫為0 .這里的號必須是一個合理的號,不合理的號,會出現(xiàn)錯誤
第2個參數(shù)是 行的標題
第3個參數(shù)是 對應(yīng)的 顯示圖標 號,后面會講到,如果不使用,就設(shè)置為 -1
(6)對于非 report項目來講,第 (5)條就可以了,但是對于 Report 樣式,還需要添加一些其它列的信息,可以使用 SetItemText(0, 1, _T("192.168.1.4")); 來添加其它的內(nèi)容
(7) 可以使用 SetItemData() 來在對應(yīng)的行中,保存一些重要的數(shù)據(jù)信息.用于程序處理
(8) 關(guān)于行高的調(diào)整 調(diào)整行高的方法有多個,但是建議使用Cimagelist 來調(diào)節(jié)
設(shè)置CListCtrl的行高沒有函數(shù)接口,可以通過自繪來實現(xiàn),但是比較麻煩。有一個比較簡單的方法是通過使用一個空白的圖像將行撐起來,使其高度發(fā)生變化。示例如下:
例如:
CImageList m_image; m_image.Create(1,24,ILC_COLOR32,1,0); m_listInfo.SetImageList(&m_image, LVSIL_SMALL);
(9 ) 對于字體的設(shè)置,我們可以使用SetFont函數(shù)來實現(xiàn)。以修改CListView的字體為例,在OnInitialUpdate函數(shù)中插入列之前調(diào)用SetFontSelf函數(shù)(該函數(shù)自定義,如下示例所示)。首先創(chuàng)建一個字體,然后調(diào)用SetFont進行設(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) 點擊表頭時進行歸類排序
系統(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()
{
//其他處理,包括設(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); //時間
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: //時間
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)于如何使用圖標的方法
需要首先將 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中 可以使用
就是直接加載 位圖資源到 圖象列表
在將圖象列表綁定到需要顯示的項目后, 要執(zhí)行一次 Detach() 函數(shù)
目的: 調(diào)用此功能分離圖像列表從 CImageList 對象。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
C++ Template 基礎(chǔ)篇(一):函數(shù)模板詳解
這篇文章主要介紹了C++ Template函數(shù)模板,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
DSP中浮點轉(zhuǎn)定點運算--定點數(shù)的加減乘除運算
本文主要介紹DSP中定點數(shù)的加減乘除運算,很值得學(xué)習(xí)一下,需要的朋友可以參考一下。2016-06-06

