C++ 关于MFC List Control 控件的总结
1\在开发项目时,使用到了listcontrol控件,就一些问题,做一下备注,以备以后使用
(1) 给list项目删除所有的项目 DeleteAllItems();
(2)给list项目添加一个列.InsertColumn(0,_T("编号"));
(3)给lista项目设置列的宽度.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的行高没有函数接口,可以通过自绘来实现,但是比较麻烦。有一个比较简单的方法是通过使用一个空白的图像将行撑起来,使其高度发生变化。示例如下:
例如:
CImageListm_image; m_image.Create(1,24,ILC_COLOR32,1,0); m_listInfo.SetImageList(&m_image,LVSIL_SMALL);
(9) 对于字体的设置,我们可以使用SetFont函数来实现。以修改CListView的字体为例,在OnInitialUpdate函数中插入列之前调用SetFontSelf函数(该函数自定义,如下示例所示)。首先创建一个字体,然后调用SetFont进行设置。需要注意的是,在退出时需要delete掉创建的字体,避免内存泄露。
//设置字体和大小
voidCMyListView::SetFontSelf(intnHeight,LPCTSTRlpszFacename)
{
//先删除原有字体
if(m_font!=NULL)
deletem_font;
m_font=newCFont;
//创建字体
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消息来处理归类问题,在该消息的处理函数中需要调用一个回调函数,这个回调函数需要我们来设计,以完成不同的归类方法。回调函数原型如下:
intCALLBACKCompareFunc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort)
针对上述回调函数,有以下几点需要搞清楚:
①对于参数lparam1和lparam2,分别为CListCtrl的两行数据,是用于比较的对象。通过CListCtrl的成员函数SetItemData来设置,该函数原型:
intSetItemData(intnIndex, DWORD_PTRdwItemData)
其第一个参数为行号,第二个参数指明了该行对应的参数。参数dwItemData通常设为一行参数的数组,如:pData[2][2]={{1,3},{2,3}};每次使用pData[i]作为dwItemData。
②对于参数lParamSort,用于指明列项,即第几列。该参数和回调函数一同通过CListCtrl的成员函数SortItems来设置,其函数原型为:
BOOLSortItems(PFNLVCOMPAREpfnCompare,DWORD_PTRdwData)
参数pfnCompare为回调函数入口地址,参数dwData为列项。
③SetItemData在初始插入数据时进行调用来设置,SortItems则在点击列表头时响应的消息处理函数中进行设置。
示例如下:
//初始化列表视图控件
BOOLCDataAnalysis::InitListCtl()
{
//其他处理,包括设置风格,插入列等等
//插入行
for(inti=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));
}
returnTRUE;
}
voidCDataAnalysis::OnHdnItemclickAnalysisList(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMHEADERphdr=reinterpret_cast<LPNMHEADER>(pNMHDR);
//TODO:Addyourcontrolnotificationhandlercodehere
//设置回调函数的参数和入口地址
m_listAnalysis.SortItems(SortFunc,phdr->iItem);
*pResult=0;
}
//排序的回调函数
intCALLBACKSortFunc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort)
{
intresult;//返回值
//两行的参数,用于比较
ANALYSISFORMAT*pAnalysis1=(ANALYSISFORMAT*)lParam1;
ANALYSISFORMAT*pAnalysis2=(ANALYSISFORMAT*)lParam2;
//排序
switch(lParamSort)
{
case0://日期
result=strcmp(pAnalysis1->Date,pAnalysis2->Date);
break;
case1://时间
result=strcmp(pAnalysis1->Time,pAnalysis2->Time);
break;
case2://ID
result=strcmp(pAnalysis1->ID,pAnalysis2->ID);
break;
case3://事件
result=wcscmp(pAnalysis1->lpszEvent,pAnalysis2->lpszEvent);
break;
default:
break;
}
returnresult;
}
关于如何使用图标的方法
需要首先将listcontrol控件绑定一个imagelist项目
方法如下
CImageListm_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对象。
以上所述就是本文的全部内容了,希望大家能够喜欢。