鱼C论坛

 找回密码
 立即注册
查看: 442|回复: 6

[已解决]CListCtrl->InsertItem

[复制链接]
发表于 2023-4-29 11:23:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
mylist4.InsertItem(1, _T("陈行甲"), 0);  //插入一行(一项)

我的问题:mylist4是CListCtrl报表模式,执行后参数3中图像列表的图像不显示

最佳答案
2023-4-29 12:14:00
根据您提供的代码,问题可能是在CListCtrl控件创建时没有关联图像列表。要在CListCtrl中显示图像,请按照以下步骤操作:

1、创建一个CImageList对象:
  1. // 创建并且加载图像列表
  2. CImageList imageListSmall;
  3. imageListSmall.Create(16, 16, ILC_COLOR24 | ILC_MASK, 4, 4);
  4. HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
  5. imageListSmall.Add(hIcon);
  6. // 对 hIcon 进行销毁,因为已经添加到图像列表中。
  7. DestroyIcon(hIcon);
复制代码

2、将该图像列表与CListCtrl关联:
  1. mylist.SetImageList(&imageListSmall, LVSIL_SMALL); // 将图像列表与 CListCtrl 关联
复制代码

3、在将项插入CListCtrl之前,使用CListCtrl::GetImageList()方法获取与CListCtrl相关联的图像列表,并针对每个需要具有图标的项使用CImageList::Draw()方法绘制图像。例如:
  1. // 根据项索引获取与 CListCtrl 相关联的图像列表
  2. CImageList* pImageList = mylist.GetImageList(LVSIL_SMALL);

  3. // 插入新的一行(一项)并指定其图片索引
  4. int nIndex = mylist.InsertItem(1, _T("陈行甲"), 0);
  5. if (pImageList && nIndex >= 0)
  6. {
  7.     // 绘制位于 0 号图像位置的图标
  8.     pImageList->Draw(&dc, 0, ptIcon, ILD_TRANSPARENT);
  9. }
复制代码

需要注意的是,以上代码示例中的ptIcon变量用于指定图像的绘制位置,如果您不需要将图像绘制到特定位置,则可以将其置为空。此外,确保与CListCtrl关联的图像列表具有足够的大小和颜色深度以容纳所需的所有图标。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-29 11:24:48 | 显示全部楼层
在CListCtrl中,报表视图(Report View)允许您使用多列来显示项目信息,并可选择显示图像。如果在执行 mylist4.InsertItem(1, _T("陈行甲"), 0); 后图像列表中的图像没有显示,可能原因有以下几点:

1. 确保您已经创建了图像列表并将其附加到CListCtrl对象。例如:

  1. CImageList m_ImageList;
  2. m_ImageList.Create(16, 16, ILC_COLOR32, 4, 4); // 创建图像列表,指定图像尺寸和颜色深度

  3. // 添加位图到图像列表
  4. CBitmap bmp;
  5. bmp.LoadBitmap(IDB_BITMAP1); // IDB_BITMAP1是资源ID
  6. m_ImageList.Add(&bmp, RGB(255, 255, 255)); // RGB(255, 255, 255)表示要透明的颜色

  7. mylist4.SetImageList(&m_ImageList, LVSIL_SMALL); // 将图像列表附加到CListCtrl对象
复制代码


2. 确保CListCtrl已经设置了报表视图(Report View)样式。您可以通过在对话框初始化函数中添加如下代码来实现:

  1. mylist4.ModifyStyle(0, LVS_REPORT); // 将CListCtrl样式设置为报表视图
复制代码


3. 确保您已经正确添加了列。例如,如果您有两列,可以按照以下方式添加:

  1. mylist4.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 100); // 插入第一列
  2. mylist4.InsertColumn(1, _T("描述"), LVCFMT_LEFT, 150); // 插入第二列
复制代码


在上述条件满足的情况下,插入一项后,图像应该可以正常显示。如果仍然无法显示,请检查您的代码以确定是否存在其他问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 12:12:36 | 显示全部楼层


  1. CImageList* pImageList;
  2. HBITMAP hbmp1;
  3. CBitmap* pBitmap1;
  4. HBITMAP hbmp2;
  5. CBitmap* pBitmap2;
  6. HBITMAP hbmp3;
  7. CBitmap* pBitmap3;
  8. HBITMAP hbmp4;
  9. CBitmap* pBitmap4;
  10. CWnd* pWnd4 = GetDlgItem(IDC_LIST4);//列表视图控件4的句柄
  11.         HWND hWnd4 = pWnd4->GetSafeHwnd();

  12.         LONG Styles = GetWindowLong(hWnd4, GWL_STYLE);//获取窗口风格
  13.         LONG l = SetWindowLong(hWnd4, GWL_STYLE, Styles | LVS_REPORT| LVS_EX_GRIDLINES); //设置新的窗口风格
  14.                 int i= mylist4.InsertColumn(0, _T("姓名"), LVCFMT_CENTER,70,-1);//在报告模式下插入一列
  15.         i = mylist4.InsertColumn(1, _T("物理"), LVCFMT_CENTER, 70, -1);
  16.         i = mylist4.InsertColumn(2, _T("化学"), LVCFMT_CENTER, 70, -1);
  17.        
  18.         int i1=mylist4.InsertItem(0, _T("李明")); //插入一行(一项)
  19.        
  20.         pImageList = new CImageList();   // 创建一个CImageList类的指针变量
  21.         pImageList->Create(32, 32, ILC_COLOR32, 0, 4); // 确定图像规格--必不可少
  22.         hbmp1 = (HBITMAP)::LoadImage(NULL, _T("D:\\bb\\tubiao\\1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
  23.         pBitmap1 = new CBitmap;
  24.         pBitmap1->Attach(hbmp1);  //CWND句柄指向win32API句柄
  25.         pImageList->Add(pBitmap1, RGB(0, 0, 0)); //添加外部文件图像

  26.         hbmp2 = (HBITMAP)::LoadImage(NULL, _T("D:\\bb\\tubiao\\2.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
  27.         pBitmap2 = new CBitmap;
  28.         pBitmap2->Attach(hbmp2);  //CWND句柄指向win32API句柄
  29.         pImageList->Add(pBitmap2, RGB(0, 0, 0)); //添加外部文件图像

  30.         hbmp3 = (HBITMAP)::LoadImage(NULL, _T("D:\\bb\\tubiao\\3.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
  31.         pBitmap3 = new CBitmap;
  32.         pBitmap3->Attach(hbmp3);  //CWND句柄指向win32API句柄
  33.         pImageList->Add(pBitmap3, RGB(0, 0, 0)); //添加外部文件图像

  34.         hbmp4 = (HBITMAP)::LoadImage(NULL, _T("D:\\bb\\tubiao\\4.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
  35.         pBitmap4 = new CBitmap;
  36.         pBitmap4->Attach(hbmp4);  //CWND句柄指向win32API句柄
  37.         pImageList->Add(pBitmap4, RGB(0, 0, 0)); //添加外部文件图像

  38.         CImageList* pold = new CImageList;
  39.         pold=mylist4.SetImageList(pImageList, LVSIL_NORMAL);//给列表视图控件设置图像列表
  40.         /*
  41.         参数1:CImageList* pImageList  图像列表指针
  42.         参数2:int nImageListType      图像的类型的列表。 它可以是以下值之一:
  43.                                 LVSIL_NORMAL 图像列表与大图标。
  44.                                 LVSIL_SMALL 图像列表与小图标。
  45.                                 LVSIL_STATE 图像列表与状态图像
  46.         返回值:CImageList*  以前的图像列表指针
  47.        
  48.         */

  49.         i1=mylist4.InsertItem(1, _T("陈行甲"), 0);  //插入一行(一项)
  50.         /*
  51.         参数1:int nItem  行的索引
  52.     参数2:LPCTSTR lpszItem  控件头的名字
  53.         参数3:int
  54.     返回值:行号
  55.        
  56.         */
  57.                
  58.        
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 12:13:30 | 显示全部楼层
请看代码    图像不显示  ??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-29 12:14:00 | 显示全部楼层    本楼为最佳答案   
根据您提供的代码,问题可能是在CListCtrl控件创建时没有关联图像列表。要在CListCtrl中显示图像,请按照以下步骤操作:

1、创建一个CImageList对象:
  1. // 创建并且加载图像列表
  2. CImageList imageListSmall;
  3. imageListSmall.Create(16, 16, ILC_COLOR24 | ILC_MASK, 4, 4);
  4. HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
  5. imageListSmall.Add(hIcon);
  6. // 对 hIcon 进行销毁,因为已经添加到图像列表中。
  7. DestroyIcon(hIcon);
复制代码

2、将该图像列表与CListCtrl关联:
  1. mylist.SetImageList(&imageListSmall, LVSIL_SMALL); // 将图像列表与 CListCtrl 关联
复制代码

3、在将项插入CListCtrl之前,使用CListCtrl::GetImageList()方法获取与CListCtrl相关联的图像列表,并针对每个需要具有图标的项使用CImageList::Draw()方法绘制图像。例如:
  1. // 根据项索引获取与 CListCtrl 相关联的图像列表
  2. CImageList* pImageList = mylist.GetImageList(LVSIL_SMALL);

  3. // 插入新的一行(一项)并指定其图片索引
  4. int nIndex = mylist.InsertItem(1, _T("陈行甲"), 0);
  5. if (pImageList && nIndex >= 0)
  6. {
  7.     // 绘制位于 0 号图像位置的图标
  8.     pImageList->Draw(&dc, 0, ptIcon, ILD_TRANSPARENT);
  9. }
复制代码

需要注意的是,以上代码示例中的ptIcon变量用于指定图像的绘制位置,如果您不需要将图像绘制到特定位置,则可以将其置为空。此外,确保与CListCtrl关联的图像列表具有足够的大小和颜色深度以容纳所需的所有图标。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 12:27:16 | 显示全部楼层
CImageList* pold = new CImageList;
        pold=mylist4.SetImageList(pImageList, LVSIL_NORMAL);

pold的返回值是NULL,说明执行失败  ,为何失败 ??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-29 12:34:53 | 显示全部楼层
pold=mylist4.SetImageList(pImageList, LVSIL_SMALL);    我改为LVSIL_SMALL就显示了
可是我的图像是32x32的,难道LVSIL_NORMAL不能显示 ??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 04:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表