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

一.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); 
。。。。。。

 
 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
 
  //名称
  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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC ListCtrl 中,可以使用 `SetItem` 函数来设置某一行的数据。为了在第二列显示图标,需要设置该列的 `iImage` 成员变量为图标的索引。具体步骤如下: 1. 创建一个包含图标的图像列表。 ```cpp CImageList m_imageList; m_imageList.Create(16, 16, ILC_COLOR, 2, 1); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); ``` 这里创建了一个 16x16 大小的图像列表,并向其中添加了两个图标。 2. 将图像列表关联到 ListCtrl。 ```cpp m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL); ``` 这里将图像列表关联到 ListCtrl,并指定图像列表的类型为 `LVSIL_SMALL`。 3. 在某一行的第二列显示图标。 ```cpp LVITEM lvItem; lvItem.mask = LVIF_IMAGE; lvItem.iItem = 0; // 要设置的行号 lvItem.iSubItem = 1; // 要设置的列号 lvItem.iImage = 1; // 图标在图像列表中的索引 m_listCtrl.SetItem(&lvItem); ``` 这里首先创建了一个 `LVITEM` 结构体,并将其 `mask` 成员变量设置为 `LVIF_IMAGE`,表示要设置该行的图标。然后将要设置的行号和列号分别设置为 `iItem` 和 `iSubItem` 成员变量。最后将图标在图像列表中的索引设置为 `iImage` 成员变量,并调用 `SetItem` 函数来设置该行的数据。 完整的示例代码如下: ```cpp // 在 OnInitDialog 函数中添加以下代码 BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // 创建图像列表 m_imageList.Create(16, 16, ILC_COLOR, 2, 1); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); // 关联图像列表ListCtrl m_listCtrl.SetImageList(&m_imageList, LVSIL_SMALL); // 在第一行第二列显示第二个图标 LVITEM lvItem; lvItem.mask = LVIF_IMAGE; lvItem.iItem = 0; lvItem.iSubItem = 1; lvItem.iImage = 1; m_listCtrl.SetItem(&lvItem); return TRUE; } ``` 这里在对话框的 OnInitDialog 函数中创建了一个图像列表,并将其关联到 ListCtrl。然后在第一行第二列显示了第二个图标。你可以根据需要修改行号、列号和图标索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值