C++关于MFCListControl控件的总结
1\在开发项⽬时,使⽤到了 listcontrol 控件,就⼀些问题,做⼀下备注,以备以后使⽤
(1) 给list项⽬删除所有的项⽬ DeleteAllItems();
(2) 给list项⽬添加⼀个列 .InrtColumn(0, _T("编号"));
(3)给list a项⽬设置列的宽度 .SetColumnWidth(0, 50);
(4) 在添加项⽬之前可以使⽤ .SetRedraw(fal); 来禁⽌重画,这样可以提⾼效率.当添加完成后,可以使⽤ .SetRedraw(true); 重新启⽤重画
(5) 添加项⽬: m_List_IpList.InrtItem(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.InrtItem(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)
{
ca 0: //⽇期
result = strcmp(pAnalysis1->Date, pAnalysis2->Date);
break;
ca 1: //时间
result = strcmp(pAnalysis1->Time, pAnalysis2->Time);
break;
ca 2: //ID
result = strcmp(pAnalysis1->ID, pAnalysis2->ID);
break;
ca 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 对象。
以上所述就是本⽂的全部内容了,希望⼤家能够喜欢。