CListCtrl和CImageList显示缩略图失败, 请问原因?

Arnis1973 2018-08-27 05:09:57
图片的宽是64, 高是72, CXListCtrl m_list是重写的CListCtrl, 先看代码:

m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | m_list.GetExtendedStyle() | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES);
m_list.ModifyStyle(0, LVS_SHOWSELALWAYS| LVS_REPORT);
m_list.SetIconSpacing(CSize(70, 75));
m_Imagelist.Create(63, 70, ILC_COLOR32 | ILC_MASK, 8, 1); //----- 实例图象框;
HBITMAP hBitmap;
CBitmap *pBitmap;
pBitmap = new CBitmap;
hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));
pBitmap->Attach(hBitmap);
int a = m_Imagelist.Add(pBitmap, RGB(0, 0, 0)); //a的 值是 0

m_list.SetImageList(&m_Imagelist, LVSIL_SMALL);

int b = m_Imagelist.GetImageCount(); //b的值是 1

LVITEM lvItem = { 0 };
//第一行数据
lvItem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_STATE; //文字、图片、状态
lvItem.iItem = 0; //行号(第一行)
lvItem.iImage = 0; //图片索引号(第一幅图片)
lvItem.iSubItem = 0; //子列号
int nRow = m_list.InsertItem(&lvItem);
m_list.SetItemText(nRow, 1, _T("PPP"));


m_Imagelist里好像加载图片成功了, 可是m_list里就是不显示图,
...全文
606 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2018-08-30
  • 打赏
  • 举报
回复
注意
”item 0“ 是在icon 下,不是 右边 !
schlafenhamster 2018-08-30
  • 打赏
  • 举报
回复

image 94*94, space 100*100
schlafenhamster 2018-08-30
  • 打赏
  • 举报
回复
间距拉开只能在LVS_ICON下可以; 对
点击只能选中第一个item, 其他都不能选中。 不会的, 程序有问题 !先 注释掉 你的 消息 响应。

想知道LVS_SMALLICON 模式下拉开间距的方法, 只能 重绘!
Arnis1973 2018-08-30
  • 打赏
  • 举报
回复
照着改写了,间距可以拉开, 不过在LVS_ICON模式下又无法选中第一个之外的item, 点击只能选中第一个item, 其他都不能选中。 是否 间距拉开只能在LVS_ICON下可以, 在LVS_SMALLICON就不行了? 是否需要什么配置才行? 试了几种组合都不行。 想知道LVS_SMALLICON 模式下拉开间距的方法
Arnis1973 2018-08-29
  • 打赏
  • 举报
回复
SetIconSpacing(5,5) 也没起作用, LVS_SMALLICON 模式下应该用这个函数吧?还有其他办法吗? 现在图标间距太大了
schlafenhamster 2018-08-29
  • 打赏
  • 举报
回复
LVS_SMALLICON 好像是自动切换到第二列的
叫“蛇形”对齐 即第一列 满 后 ,在 到 第2 列
Arnis1973 2018-08-29
  • 打赏
  • 举报
回复
LVS_SMALLICON 好像是自动切换到第二列的, 问题是列之间的间距太大了, 怎么调整一下呢?
schlafenhamster 2018-08-29
  • 打赏
  • 举报
回复
除了report 没有 subitem 之说, 意思 就是没有其他列 ! ListCtrl 本身 不需要 列头 !
Arnis1973 2018-08-29
  • 打赏
  • 举报
回复
m_ListWiew.InsertItem(0,"0",0); m_ListWiew.InsertItem(1,"1",0); m_ListWiew.InsertItem(2,"2",0); m_ListWiew.InsertItem(3,"3",0); m_ListWiew.InsertItem(4,"4",0); 这个是添加进第0列, 问题是怎么插入其他列数据
schlafenhamster 2018-08-29
  • 打赏
  • 举报
回复
除了report 没有 subitem 之说。 如
m_ListWiew.SetImageList(&m_imgList, LVSIL_SMALL);
m_ListWiew.SetFont(&m_BnFont);
m_ListWiew.InsertItem(0,"0",0);
m_ListWiew.InsertItem(1,"1",0);
m_ListWiew.InsertItem(2,"2",0);
m_ListWiew.InsertItem(3,"3",0);
m_ListWiew.InsertItem(4,"4",0);
Arnis1973 2018-08-29
  • 打赏
  • 举报
回复
LVS_REPORT模式下能插入多行多列数据, 可是鼠标点击不能选中第0列之外的其他 item. 就是说 SetItem 插入的项都不能被鼠标点击选中。 所以想测试一下 LVS_SMALLICON 模式, 现在是不知道 LVS_SMALLICON 模式怎么添加 第0列 之外的其他 item
Arnis1973 2018-08-29
  • 打赏
  • 举报
回复
如果是 LVS_REPORT模式, 可以用 InsertItem 和 SetItem 插入数据 我选的是 LVS_SMALLICON 模式, 经测试 SetItem 不起作用, 网上查资料说 LVS_SMALLICON 只用 InsertItem 即可, 实际测试只能插入第0列。 SetItem 又不起作用。 有人在 LVS_SMALLICON 模式 下插入过数据吗? 要求插入多行多列, 不是只插入第0列。 怎么插入呢?
schlafenhamster 2018-08-29
  • 打赏
  • 举报
回复
icon
CBitmap bitmap;
// cx cy
m_imgBigList.Create(48, 48, ILC_COLOR8|ILC_MASK, 1, 0);
bitmap.LoadBitmap(IDB_BITMAP5);
m_imgBigList.Add(&bitmap,(COLORREF)0xFFFFFF);
bitmap.DeleteObject();//
//
m_imgList.Create(16, 16, ILC_COLOR8|ILC_MASK, 1, 0);
bitmap.LoadBitmap(IDB_BITMAP7);
m_imgList.Add(&bitmap,(COLORREF)0xFFFFFF);
bitmap.DeleteObject();//

schlafenhamster 2018-08-29
  • 打赏
  • 举报
回复

//
m_ListWiew.ModifyStyle(LVS_REPORT,LVS_ICON);
DWORD dwStyle = m_ListWiew.GetExtendedStyle();//33
dwStyle |=LVS_EX_FULLROWSELECT;// 32
dwStyle &=~LVS_EX_GRIDLINES;// 1
m_ListWiew.SetExtendedStyle(dwStyle);
//
m_ListWiew.SetImageList(&m_imgList,LVSIL_SMALL);
m_ListWiew.SetImageList(&m_imgBigList, LVSIL_NORMAL);
// m_ListWiew.SetFont(&m_BnFont);
LVITEM lvi;
CString strItem;
CSize sz=m_ListWiew.SetIconSpacing(80,80);
afxDump << sz << "\n";// 97*97
for (int i = 0; i < 5; i++)
{
// Insert the first item
lvi.mask = LVIF_IMAGE | LVIF_TEXT;
strItem.Format(_T("Item %i"), i);

lvi.iItem = i;
lvi.iSubItem = 0;
lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
lvi.iImage = 0; // There are 5 images in the image list
m_ListWiew.InsertItem(&lvi);
}

注意 重新设置 LVS_ICON
m_ListWiew.ModifyStyle(LVS_REPORT,LVS_ICON);
SetIconSpacing(80,80); 就起作用了 。
zgl7903 2018-08-29
  • 打赏
  • 举报
回复
第0列使用 InsertItem, 后面的都用 SetItem

lvItem.mask = LVIF_IMAGE;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.iImage = 0;
int nRow = m_list.InsertItem(&lvItem);

lvItem.mask = LVIF_IMAGE;
lvItem.iItem = nRow;
lvItem.iSubItem = 1;
lvItem.iImage = 0;
m_list.SetItem(&lvItem);
schlafenhamster 2018-08-29
  • 打赏
  • 举报
回复
如 Icon 是 48*48,SetIconSpacing(48+5,48+5)
自绘是
::DrawIconEx(pDC->GetSafeHdc(),rect.left,top,m_hIcon,cx,cy,NULL,
(HBRUSH)NULL,DI_NORMAL);
Arnis1973 2018-08-29
  • 打赏
  • 举报
回复
引用 20 楼 schlafenhamster 的回复:
SetIconSpacing(5,5) 要 包含 icon 大小 ! 不行 就得 自绘 了
什么 包含 icon 大小 ? 我 参数没写错吧。 SetIconSpacing(int cx, int cy) 要调整图标间距, 自绘里怎么调整间距?
schlafenhamster 2018-08-29
  • 打赏
  • 举报
回复
SetIconSpacing(5,5) 要 包含 icon 大小 !
不行 就得 自绘 了
Arnis1973 2018-08-28
  • 打赏
  • 举报
回复
使用 ICON 或者 LIST 格式 能选中同一行的 第二图吗?
schlafenhamster 2018-08-28
  • 打赏
  • 举报
回复
m_list.SetItem(&lvitem); 是report 格式的 sub item ,实际只插入 InsertItem(&lvItem); 一项
点击 子项 , 并不能 选中
如果 每项 都是 icon 使用 icon 格式
加载更多回复(8)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧