【原创】CListCtrl和CImageList显示缩略图,图片自动排列。

首先将你的CListCtrl风格设置为ICON风格

CImageList  m_ImageList;

CListCtrl    m_list;

 

m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

m_list.SetIconSpacing(CSize(140, 130));     //set pictures spacing

//wide of picture is 120,height is 90

m_ImageList.Create(120,90,ILC_COLORDDB|ILC_COLOR32,1,1);

m_list.SetImageList(&m_ImageList,LVSIL_NORMAL);     //CImageList associates CListCtrl

 

//此处用GDI+,

Bitmap bmp(文件的相对或绝路径);                //传入图片路径

int sourceWidth = 120;                                           //获得图片宽度,这个120和创建的120保持相同。

int sourceHeight = bmp.GetHeight();                 //获得图片宽度                                   

if(sourceHeight>120)             / /和m_ImageList.Create(120…)有很大关系,如果小于设

                         //定的宽度,图片将无法显示。

{

    sourceHeight=120;

}

else

{

    sourceHeight=bmp.GetHeight();

}

 

Bitmap* pThumbnail = (Bitmap*)bmp.GetThumbnailImage(sourceWidth , sourceHeight , NULL, NULL); //设定缩略图的大小

HBITMAP hBmp;

pThumbnail->GetHBITMAP(Color(255,255,255),&hBmp);

CBitmap *pImage = CBitmap::FromHandle(hBmp);         //转换成CBitmap格式位图

 

 

_wsplitpath(*photo_iter ,drive,dir,fname,ext );

wcscpy_s(itemName,fname);

wcscat_s(itemName,ext);

 

int a=m_imageList.Add(pImage,RGB(255,255, 255));

m_pictureList.InsertItem(a,itemName,a);               // itemName,你自己设法得到图片片的名字。名字会显示在图片下面。

 

//这里要注意,一定要用InsertItem(a,itemName,a);之前的m_list不需要在insert(I,_T(””));更不需要setItemText(item,subItem,Text),这可能会导致插入相同的图片。

 

顺便说下GDI+这个鬼东西,不懂原理,直接说应用。会用的高手见笑。VS2008自带了GDI+,不需要下载。

1.声明头文件,在stdafx中,或者能被你编译到其他地方都可以。

#include <gdiplus.h>             //GDI+声明,可以GDI/GDI+混合使用

#pragma comment(lib, "gdiplus.lib")

using namespace Gdiplus;

2.初始化GDI+,

CMyApp: public CWinApp

{

  …………

    ULONG_PTR m_gdiplusToken;

…………

};

BOOL CMyApp::InitInstance()    //在这个函数中添加

{

    //初始化GID+

    GdiplusStartupInput gdiplusStartupInput;       

    GdiplusStartup( &m_gdiplusToken,&gdiplusStartupInput,NULL );

}

int CMobilePCApp::ExitInstance()      //释放GDI+调用,这个函数需要自己写。别忘了声明。

{

    GdiplusShutdown( m_gdiplusToken );

    return CWinApp::ExitInstance();

}

当时这样做了后,我的GDI+还是不能用,添加图片时候Bitmap bmp(文件的相对或绝路径); bmp这个东西无效,里面有个空指针的东西,可见GDI+并没有初始化。后来先,初始化GDI+这段代码没有执行到。好了,那就把初始化的代码放到可以执行到的地方。

在主对话框的InitInstance()中添加

    //初始化GID+

    GdiplusStartupInput gdiplusStartupInput;       

    GdiplusStartup( &m_gdiplusToken,&gdiplusStartupInput,NULL );

好了,GDI+可以使用了,可以添加缩略图了。截图一张。

 

 

每行图片的数量随窗口大小自动排列。按下面设置属性。

CListCtrl属性
Alignment设置为top
Auto Arrage设置为True.

如有疑问,请留言。

 

 

//ClimageList无效的原因 1,creare的大小;2,如果是被重写的类,在drawItem重新绘制,不能在关联CImageList

.h
CListCtrlCl             m_dataStatisticsList;
CImageList              m_DataImageList;

.cpp

        m_DataImageList.Create(44,30,ILC_COLOR24,2,2);
//bmp.Attach(tempBitmap);
bmp.LoadBitmap(IDB_CONTACT);
int a=m_DataImageList.Add(&bmp,RGB(255,255,255));
int b=m_DataImageList.GetImageCount();

m_dataStatisticsList.SetImageList(&m_DataImageList,LVSIL_SMALL);
for(int i=0;i<5;i++)
{
     m_dataStatisticsList.InsertItem(i,_T(""),0); //0是CImageList的第一个图标。
}


分析:在m_DataImageList.Add(&bmp,RGB(255,255,255));之后,得到的CImageList的元素数量b还为0,原因可能在于 m_DataImageList.Create(44,30,ILC_COLOR24,2,2); 前两个参数图片的宽度和长度大于了图片本身,就会add失败。

在add成功后,b将成为1。 但是 m_dataStatisticsList.InsertItem(i,_T(""),0); 还不见图片,插入的文字倒是没有问题。 这个原因在于m_dataStatisticsList是一个被重写的类CListCtrlCl的对象。在CListCtrlCl中的drawItem并没有绘出图片。

 

转载于:https://www.cnblogs.com/yuzhould/archive/2010/07/30/4455008.html

CListCtrlMFC中常用的列表控件,用于显示表格数据。缩略图是指一种较小的图像,通常用于显示文件、图片等的预览图。那么,如何在CListCtrl显示缩略图呢? 首先,需要在CListCtrl的样式中设置LVS_ICON,以便将列表项以图标的形式显示出来。 然后,为每个列表项添加图标。可以使用CImageList类创建一个图像列表,并将缩略图添加到图像列表中。然后,将图像列表与CListCtrl关联,通过SetImageList函数设置到CListCtrl中。 接下来,为每个列表项设置对应的图标索引。通过调用CListCtrl的SetItem函数,可以设置每个列表项的图标索引,使得每个列表项都能正确显示对应的缩略图。 最后,在需要显示缩略图的时候,调用CListCtrl的Update方法更新列表项,即可在CListCtrl显示缩略图。可以通过调用GetItemRect函数获取列表项的位置和大小,并使用CImageList的Draw函数将缩略图绘制到指定的位置上。 需要注意的是,缩略图的大小要与图像列表中图像的大小一致,否则可能会导致显示异常。此外,为了实现更复杂的功能,还可以通过重载CListCtrl的相关消息处理函数,来实现一些自定义的操作,比如鼠标点击、拖拽等。 在使用CListCtrl显示缩略图时,需要注意控件的初始化和资源的释放,防止内存泄露和程序崩溃的问题。 总结起来,通过设置控件样式、创建图像列表、设置图标索引以及更新列表项等步骤,可以在CListCtrl显示缩略图,实现更美观和功能性的列表展示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值