首先将你的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属性 如有疑问,请留言。
//ClimageList无效的原因 1,creare的大小;2,如果是被重写的类,在drawItem重新绘制,不能在关联CImageList .h .cpp m_dataStatisticsList.SetImageList(&m_DataImageList,LVSIL_SMALL);
在add成功后,b将成为1。 但是 m_dataStatisticsList.InsertItem(i,_T(""),0); 还不见图片,插入的文字倒是没有问题。 这个原因在于m_dataStatisticsList是一个被重写的类CListCtrlCl的对象。在CListCtrlCl中的drawItem并没有绘出图片。 |
CListCtrl和CImageList显示缩略图,图片自动排列。
2010-07-30 18:42