在ListCttrl控件(Report风格)的使用上,有时需要向子列中插入图标,例如要制作一个下载软件,我们计划在控件的第一列用图标的形式显示下载状态:排队、下载中、出错等等,第二列计划用图标显示下载文件类型,要做出这样的效果,就必须使用CListCtrl的SetItem(八个参数)方法,由于我这台电脑上没有MSDN所以这八个参数具体都是什么意思我暂时不清楚,在这只介绍下跟我们的操作关系密切的几个参数。

SetItem()从左向右数第一个参数(从1起计数)表示操作行的行号,这个行号从0计数,最好这个参数设置为InsertItem()的返回值,也就是说应该先用InsertItem()插入一个空行,之后用SetItemText()具体设置插入行每一列的值。SetItem()的第二个参数表示即将操作的列号,也就是我们打算将图标插入到第几列中,该行号从0计数。SetItem()的第五个参数表示图标在CImageList对象(该对象已经通过SetImageList(&ImageList, LVSIL_SMALL)附属至CListCtrl控件)中的序数,该序数从0计数,顺便说一句,准备附属到CListCtrl控件的CImageList对象必须是全局性的,比如可以是类的成员,否则就算其他操作都都正确也看不到图标。

举个例子我们使用的CListCtrl控件的控制对象为m_List,m_List中已经添加了三个列,IDX是InsertItem()的返回值,表示刚刚插入的新行,附属到m_List的CImageList对象中有5个图标,我们通过m_List.SetItem(IDX, 0, LVIF_IMAGE, NULL, 1, 0, 0, 0);之后,就把CImageList对象中的第1个图标插在了第一列的前部(原先第一列的文字还在),之后接着通过m_List.SetItem(IDX, 2, LVIF_IMAGE, NULL, 0, 0, 0, 0);就把CImageList对象中的第0个图标插在了第二列的前部(原先的文字还在)。可以看到如下实例图:

有一点值得说明,如果只在子列中插入了图标而没有给主列(第一列)插入任何图标,则默认第一列将插入与同一行最后一次给子列插入图标。还有重要的一点,如果想在子列插入图标,首先必须使ListCtrl控件具备LVS_EX_SUBITEMIMAGES风格,例如我们可以通过m_List.SetExtendedStyle(m_List.GetExtendedStyle()|LVS_EX_SUBITEMIMAGES);给控件附加该风格。
注意事项:如果插入后没有显示 或者是 显示的不是预想的图标 很有可能是图片的属性 和 CImageList创建的时候不相符合 比如 m_imglist.Create(66, 16, ILC_COLORDDB,0,0); 如果你插入的BMP不是66X16大小 很有可能就会插入失败 而且这里是可能失败 这样就造成了 不会报错 但是图标显示的结果有可能和想要的不通 至于哪些图标可以显示 哪些不能显示 这个就不容易看出来 而且如果第一张插入失败了 第二张插入成功 在显示图标的时候 第二张就变成第一张了 比较隐含的错误 一定注意!
//

一.CListCtrl在第一列添加图标

CListCtrl可以很方便的在第一列添加图标, 并且在不同的显示方式(1:LVS_ICON: 为每个item显示大图标;2:LVS_SMALLICON: 为每个item显示小图标;3: LVS_LIST: 显示一列带有小图标的item;4:LVS_REPORT: 显示item详细资料)下, 都可以把第一列的图标显示出来.。

具体方法为:

1.在Dialog的头文件中声明CListCtrl控件和CImageList类变量

CListCtrl       m_lstEnumDev;                  
CImageList    m_SmallIcon;                     //保存小图标
CImageList    m_LargeIcon;                    //保存大图标

2.在Dialog的OnInitDialog()中

/*******设置列表表头内容和宽度*****/
m_lstEnumDev.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |   LVS_EDITLABELS|   LVS_EX_SUBITEMIMAGES );             //一定要设置LVS_EX_SUBITEMIMAGES
m_lstEnumDev.InsertColumn(0,"名称");    
m_lstEnumDev.SetColumnWidth(0,80);
。。。。。。

/**********绑定SmallIcon和LargeIcon到CListCtrl上******/
 m_SmallIcon.Create(16,16, 1, 10, 4);
 m_LargeIcon.Create(32,32, 1, 10, 4);
 m_SmallIcon.Add(AfxGetApp()->LoadIcon(IDI_ICON_SMALL));
 m_LargeIcon.Add(AfxGetApp()->LoadIcon(IDI_ICON_LARGE));
m_lstEnumDev.SetImageList(&m_LargeIcon,LVSIL_NORMAL);  
m_lstEnumDev.SetImageList(&m_SmallIcon,LVSIL_SMALL);、

/********显示列表中的信息*********/
 ShowListInfo();

3.在ShowListInfo()中显示列表中的信息

for (int i=0;i<iItemNum;i++)

  //名称
  LV_ITEM lvitem;
  memset ((char *) &lvitem, '\0', sizeof (LV_ITEM));
  lvitem.mask = LVIF_TEXT | LVIF_IMAGE  | LVIF_STATE;
  lvitem.iItem = i;
  lvitem.iSubItem = 0;
  lvitem.stateMask = 0;
  lvitem.iImage = 0;          //显示不同的图标时,可以把一个int 变量赋给这个属性值
  lvitem.pszText = "名称";
  m_lstEnumDev.InsertItem (&lvitem);
}

实现以上3步,就可以显示带图标的文本项了。

4.可在Dialog的头文件中声明CComboBox m_cmbViewType变量,控制不同的显示方式。

/******初始化下拉列表*****/
 m_cmbViewType.AddString("详细信息");
 m_cmbViewType.AddString("平铺");
 m_cmbViewType.AddString("图标");
 m_cmbViewType.AddString("列表");
 m_cmbViewType.SetCurSel(0);

5.相应CComboBox的CBN_SELCHANGE消息,实现不同的显示方式

int nSel = m_cmbViewType.GetCurSel();
 switch(nSel)
 {
 case 0:
  m_lstEnumDev.ModifyStyle ( LVS_SMALLICON | LVS_LIST | LVS_ICON,LVS_REPORT, TRUE);
  break;
 case 1:
        m_lstEnumDev.ModifyStyle ( LVS_SMALLICON | LVS_LIST | LVS_REPORT,LVS_ICON, TRUE); 
  break;
 case 2:
        m_lstEnumDev.ModifyStyle (LVS_ICON | LVS_LIST | LVS_REPORT | LVS_OWNERDRAWFIXED, LVS_SMALLICON, TRUE);
     break;
 case 3:
  m_lstEnumDev.ModifyStyle (LVS_ICON | LVS_SMALLICON | LVS_REPORT | LVS_OWNERDRAWFIXED, LVS_LIST, TRUE);
     break;
 default:
  m_lstEnumDev.ModifyStyle ( LVS_SMALLICON | LVS_LIST | LVS_ICON,LVS_REPORT, TRUE);
     break;
 }

经过以上5步,即可实现,在不同的显示方式下,使列表的第一列显示(相同或不同的)图标。

二.CListCtrl非第一列添加图标

如果除了要使第一列显示图标外,还要使也其他列显示。只需要按照第一列那样声明一个LV_ITEM    lvitem;

lvitem.mask = LVIF_TEXT | LVIF_IMAGE  | LVIF_STATE;
  lvitem.iItem = i;
  lvitem.iSubItem = j;   //列数
  lvitem.stateMask = 0;//显示不同的图标时,可以把一个int 变量赋给这个属性值
  lvitem.iImage = 0;

如果只让非第一列显示图标,就会出现一个问题——CImageList是和CListCtrl的第一列绑定的,这个第一列是逻辑上的。

那可不可以使(视图上的)非第一列变成(逻辑上的)的第一列呢?
我的实现思想是:显示在视图上的非第一列其实是CListCtrl的逻辑上的第一列,即:m_lstEnumDev.InsertColumn(0,"名称");这个" 0" 其实就是逻辑上的第一列。

那该怎么实现呢?
我的实现思想是:使第一列和其他的某列交换位置。调用了CListCtrl 的GetHeaderCtrl()方法,通过表头控件CHeaderCtrl的SetOrderArray设置(视图上的)显示顺序。

/*******第一和最后一列交换位置***/ 
 CHeaderCtrl *pmyHeaderCtrl = m_lstEnumDev.GetHeaderCtrl();
 int   nCount   =   pmyHeaderCtrl->GetItemCount();  
 LPINT   pnOrder   =   (LPINT)   malloc(nCount*sizeof(int));  
 ASSERT(pnOrder   !=   NULL);  
   
 pmyHeaderCtrl->GetOrderArray(pnOrder,   nCount);   
 int nTemp;
 nTemp     = pnOrder[0];
 pnOrder[0]        =   pnOrder[nCount-1];  
 pnOrder[nCount-1] = nTemp;

pmyHeaderCtrl->SetOrderArray(nCount,   pnOrder);  
 free(pnOrder);

这样再显示时,在视图上,第一列就变成最后一列了。当选择不同的显示方式时,都可以看到图标。

在ListCtrl控件中插入图标相关推荐

  1. delphi RichEdit控件中插入GIF动画表情

    delphi在RichEdit控件中插入GIF动画表情 在UDP即时通讯软件中实现类似于QQ的动画表情,在richEdit控件中插入gif动画表情. 发送的时候将表情转为命令,接收之后,再将命令转换为 ...

  2. Qt实现类似Designer中的拖拽效果:从左侧树控件中拖动图标到右侧布局窗口

    大家在Qt开发中都用过这样的拖动操作,从左边拖动一个控件到右侧的窗口.或是在其它很多软件使用中,都有把图标通过拖动布置到主画面的操作. 如何实现呢? 先看看Qt帮助中的一个实例: 这个例子自定义了一个 ...

  3. QT使用阿里巴巴矢量图标库设置窗口图标、菜单栏项图标、工具栏项图标、状态栏图标以及将控件设置为图标

    在阿里巴巴矢量图标库官网上下载图标,具体操作在下方有讲解. 在QT项目中设置图标示例. 我总结了一下需要设置图标的地方大致分为5个,如下: 1. 设置窗口图标(利用setWindowIcon()属性实 ...

  4. ListCtrl控件着色

    最近在写一款山寨的反病毒软件,大致功能已经实现,还有一些细小的环节需要细化. 其中,在界面编程中,就用到了给ListCtrl控件着色,查看了网上一些文章,终于实现了. 其实说白了,原理很简单,就是Li ...

  5. MFC控件——ListCtrl控件[翻译](续)

    四.实践学习:一个ListCtrl的详细实现 1.切换到第一个对话框点击ListCtrl控件 2.在属性窗口,改变View属性为Report 3.创建ListCtrl的列,在OnInitDialog( ...

  6. 如何:在 Windows 窗体 ListView 控件中启用平铺视图 【转载】

    本文转载自http://msdn.microsoft.com/zh-cn/library/s8z85th0(VS.80).aspx 借助于 ListView 控件的平铺视图功能,可以在图形信息和文本信 ...

  7. 控件中一些常用的属性和事件

    1.1常用基本属性 1)Name:表示控件的名称. 2)Enabled:表示控件是否可以对用户交互做出响应. 3)Font:表示控件中显示文字的字体格式,包括字体名称.字号以及是否以斜体.加粗和下划线 ...

  8. CListCtrl控件中InsertItem和SetItemText函数及CTreeCtrl::SetItemText

    如果不先调用InsertItem这个函数,后面的SetItemText函数写了,也不起作用. InsertItem在MSDN中的函数原型如下         int InsertItem( const ...

  9. [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十三:在DetailsView控件中使用TemplateField...

    导言 比起BoundField.CheckBoxField.HyperLinkField以及其他的那些数据字段控件(data field controls)来说,TemplateField提供了一种高 ...

最新文章

  1. TensorRT Samples: MNIST(Plugin, add a custom layer)
  2. 过滤驱动加密文件(代码)
  3. DPDK — TestPMD
  4. 六个月学php,修学六个月心得体会
  5. 白话Elasticsearch44-深入聚合数据分析之案例实战_颜色+品牌下钻分析时按最深层metric进行排序
  6. 12、HTML <form>标签(表单)
  7. 如何设置mysql的权限_mysql 权限控制
  8. 【Mac软件推荐】Alfred:Mac下最好的快速启动工具
  9. Facebook为Messenger应用添加群组付款功能
  10. 怎么用vc采集ni卡数据_8bit,200MS/s 低成本模拟输入高速采集卡FCFR-PCI9850
  11. 从lambda表达式看final关键字
  12. 周老师打酒喝光回 递归
  13. selenium webdriver (6) -- iFrame
  14. 计算机中的管理应用,计算机在企业管理中应用_29067.doc
  15. mysql ulimit_Ubuntu 16.04 装机后如何永久更改ulimit和修改MySQL的存储路径datadir
  16. x86下SylixOS引导过程分析
  17. java的hashmap排序_Java HashMap两种简便排序方法解析
  18. 青出于蓝而胜于蓝 论AI大公司是拼不过小创企的
  19. rp_rv1126开发板UVC XU扩展协议功能验证
  20. 软考证书如何评职称?

热门文章

  1. 拥抱RxJava(番外篇):关于RxJava的Tips Tricks
  2. 手机安全卫士——进程管理
  3. 关于java文件扩展名认识
  4. 飞机游戏在C语言程序的基本语句能完成功能的体会
  5. excel生成sql
  6. 前嗅ForeSpider教程:网站登录配置
  7. 文档型数据库列一般都是弱项
  8. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)
  9. PMBOK学习笔记二-项目管理过程
  10. 用Qt写软件系列五:一个安全防护软件的制作(2)