鱼C论坛

 找回密码
 立即注册
查看: 673|回复: 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对象:
// 创建并且加载图像列表
CImageList imageListSmall;
imageListSmall.Create(16, 16, ILC_COLOR24 | ILC_MASK, 4, 4);
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
imageListSmall.Add(hIcon);
// 对 hIcon 进行销毁,因为已经添加到图像列表中。
DestroyIcon(hIcon);
2、将该图像列表与CListCtrl关联:
mylist.SetImageList(&imageListSmall, LVSIL_SMALL); // 将图像列表与 CListCtrl 关联
3、在将项插入CListCtrl之前,使用CListCtrl::GetImageList()方法获取与CListCtrl相关联的图像列表,并针对每个需要具有图标的项使用CImageList::Draw()方法绘制图像。例如:
// 根据项索引获取与 CListCtrl 相关联的图像列表
CImageList* pImageList = mylist.GetImageList(LVSIL_SMALL);

// 插入新的一行(一项)并指定其图片索引
int nIndex = mylist.InsertItem(1, _T("陈行甲"), 0);
if (pImageList && nIndex >= 0)
{
    // 绘制位于 0 号图像位置的图标
    pImageList->Draw(&dc, 0, ptIcon, ILD_TRANSPARENT);
}
需要注意的是,以上代码示例中的ptIcon变量用于指定图像的绘制位置,如果您不需要将图像绘制到特定位置,则可以将其置为空。此外,确保与CListCtrl关联的图像列表具有足够的大小和颜色深度以容纳所需的所有图标。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

1. 确保您已经创建了图像列表并将其附加到CListCtrl对象。例如:
CImageList m_ImageList;
m_ImageList.Create(16, 16, ILC_COLOR32, 4, 4); // 创建图像列表,指定图像尺寸和颜色深度

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

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

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

3. 确保您已经正确添加了列。例如,如果您有两列,可以按照以下方式添加:
mylist4.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 100); // 插入第一列
mylist4.InsertColumn(1, _T("描述"), LVCFMT_LEFT, 150); // 插入第二列

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

使用道具 举报

 楼主| 发表于 2023-4-29 12:12:36 | 显示全部楼层
CImageList* pImageList;
HBITMAP hbmp1;
CBitmap* pBitmap1;
HBITMAP hbmp2;
CBitmap* pBitmap2;
HBITMAP hbmp3;
CBitmap* pBitmap3;
HBITMAP hbmp4;
CBitmap* pBitmap4;
CWnd* pWnd4 = GetDlgItem(IDC_LIST4);//列表视图控件4的句柄
        HWND hWnd4 = pWnd4->GetSafeHwnd();

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

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

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

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

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

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

使用道具 举报

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

使用道具 举报

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

1、创建一个CImageList对象:
// 创建并且加载图像列表
CImageList imageListSmall;
imageListSmall.Create(16, 16, ILC_COLOR24 | ILC_MASK, 4, 4);
HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
imageListSmall.Add(hIcon);
// 对 hIcon 进行销毁,因为已经添加到图像列表中。
DestroyIcon(hIcon);
2、将该图像列表与CListCtrl关联:
mylist.SetImageList(&imageListSmall, LVSIL_SMALL); // 将图像列表与 CListCtrl 关联
3、在将项插入CListCtrl之前,使用CListCtrl::GetImageList()方法获取与CListCtrl相关联的图像列表,并针对每个需要具有图标的项使用CImageList::Draw()方法绘制图像。例如:
// 根据项索引获取与 CListCtrl 相关联的图像列表
CImageList* pImageList = mylist.GetImageList(LVSIL_SMALL);

// 插入新的一行(一项)并指定其图片索引
int nIndex = mylist.InsertItem(1, _T("陈行甲"), 0);
if (pImageList && nIndex >= 0)
{
    // 绘制位于 0 号图像位置的图标
    pImageList->Draw(&dc, 0, ptIcon, ILD_TRANSPARENT);
}
需要注意的是,以上代码示例中的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-11-21 21:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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