您的位置:首页 > 其它

转:mfc 在ListCtrl控件的非第一列添加图标

2013-08-23 18:36 1401 查看
转:http://wanderwarriorhsiao.blog.hexun.com/13005981_d.html

一.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);
这样再显示时,在视图上,第一列就变成最后一列了。当选择不同的显示方式时,都可以看到图标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息