C++ 关于MFC List Control 控件的总结

 更新时间:2020年4月25日 17:39  点击:1835

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,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.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));
  }

  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)
  {
  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, 1, RGB(255, 255, 0));
m_List_IpList.SetImageList(&m_image, LVSIL_SMALL);
m_image.Detach();   //这一句话 非常的重要,如果没有这句话, 图标不会显示

前两句的意思就是 建立一个 CImagelist 项目

其中 第二句 在VB6.0上 可能不存在, 在 VS2012中 可以使用

就是直接加载 位图资源到 图象列表

在将图象列表绑定到需要显示的项目后, 要执行一次 Detach() 函数

目的:     调用此功能分离图像列表从 CImageList 对象。

以上所述就是本文的全部内容了,希望大家能够喜欢。

[!--infotagslink--]

相关文章

  • Java8 实现stream将对象集合list中抽取属性集合转化为map或list

    这篇文章主要介绍了Java8 实现stream将对象集合list中抽取属性集合转化为map或list的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05
  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • Java8处理List的双层循环问题

    这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-19
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C# List 排序各种用法与比较

    这篇文章主要介绍了C# List 排序各种用法与比较的相关资料,需要的朋友可以参考下...2020-06-25
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • C# List介绍及具体用法

    这篇文章主要介绍了C# List介绍及具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • Java List集合返回值去掉中括号('[ ]')的操作

    这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25