MFC CListctr显示缩略图
阅读原文时间:2023年07月15日阅读:1

我们知道通过CImageList可以让listctr显示出图片,但是添加的图片大小必须和要CImageList 创建的图片大小一致,才能显示出来。最近遇到一个需求,需要把很多大小不一的jpeg图片通过列表框来显示出缩略图。

首先创建指定大小的CImageList

void CListEx::setCreateImageList(int iWidth, int iheight)
{
m_iImageWidth = iWidth;
m_iImageHeight = iheight;
m_imageList.Create(m_iImageWidth, m_iImageHeight, ILC_COLOR32, , );
SetImageList(&m_imageList, LVSIL_SMALL);
}

采用Gdi来缩放的,路径为图片的路径,jpeg也支持,不需要转换格式

void CListEx::AddImage(LPCSTR imagePath)
{
WCHAR path[] = { };
::MultiByteToWideChar(CP_ACP, , (const char *)imagePath, strlen(imagePath), path, sizeof(path));

Gdiplus::Bitmap bmp(path);

int sourceWidth = m\_iImageWidth;  
int sourceHeight = bmp.GetHeight();

if (sourceHeight > m\_iImageHeight)  
{  
    sourceHeight = m\_iImageHeight;  
}  
else  
{  
    sourceHeight = bmp.GetHeight();  
}

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

pThumbnail->GetHBITMAP(Gdiplus::Color(LIST\_BKCOLOR), &hBmp);  
CBitmap \*pImage = CBitmap::FromHandle(hBmp);

m\_imageList.Add(pImage, RGB(, , ));

// 下面的代码,如果没有,会产生内存泄漏  
delete pThumbnail;  
pThumbnail = NULL;  
pImage->DeleteObject();  
pImage->DeleteTempMap();  

}

别忘了初始化gdi,在CXXXApp::InitInstance()里添加初始化代码

//初始化Gdi+  
Gdiplus::GdiplusStartupInput gdiplusStartupInput;  
Gdiplus::GdiplusStartup(&m\_gdiplusToken, &gdiplusStartupInput, NULL);    

在CXXXApp::ExitInstance()里添加关闭gdi代码

Gdiplus::GdiplusShutdown(m_gdiplusToken);

在CXXXApp的头文件里添加m_gdiplusToken的声明

ULONG_PTR m_gdiplusToken;

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章