C++ 关于MFC List Control 控件的总结
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,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消息来处理归类问题,在该消息的处理函数中需要调用一个回调函数,这个回调函数需要我们来设计,以完成不同的归类方法。回调函数原型如下: 针对上述回调函数,有以下几点需要搞清楚: ① 对于参数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,m_analysis[i].Time,_TRUNCATE); m_listAnalysis.SetItemText(i,wStr); //时间 mbstowcs_s(&converted,m_analysis[i].ID,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 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,RGB(255,255,0)); m_List_IpList.SetImageList(&m_image,LVSIL_SMALL); m_image.Detach(); //这一句话 非常的重要,如果没有这句话,图标不会显示 前两句的意思就是 建立一个 CImagelist 项目 其中 第二句 在VB6.0上 可能不存在,在 VS2012中 可以使用 就是直接加载 位图资源到 图象列表 在将图象列表绑定到需要显示的项目后,要执行一次 Detach() 函数 目的: 调用此功能分离图像列表从 CImageList 对象。 以上所述就是本文的全部内容了,希望大家能够喜欢。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |