如何解决如何在MFC listControl报表视图中显示不同尺寸的图片
我试图在 MFC ListControl 报告视图中显示不同大小的图像以及 CImageList。但是 CImageList 有它自己的限制,只能添加相同大小的图像,有些图像失真。如何显示图像而没有失真?有什么建议将不胜感激!
如您所见,shape1 严重扭曲,shape2 看起来显示得很好,因为它的比例接近 CImageList 大小比例;
这是我的 CImageList 创建代码:
// Set ListControl style
DWORD dwStyle;
dwStyle = m_listCtrl.GetExtendedStyle();
dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SUBITEMIMAGES;
m_listCtrl.SetExtendedStyle(dwStyle);
// Create columns
CRect mRect;
m_listCtrl.GetWindowRect(&mRect);
int width = mRect.Width() * (1.0 / 6);
int width2 = mRect.Width() * (1.0 / 3);
m_listCtrl.InsertColumn(0,_T("截图"),LVCFMT_CENTER,width,-1);
m_listCtrl.InsertColumn(1,_T("数据"),width2,-1);
m_listCtrl.InsertColumn(2,_T("套数"),-1);
m_listCtrl.InsertColumn(3,_T("备注"),-1);
//Create CImageList
m_pImgList->Create(60,30,ILC_COLOR24,10,20);
m_listCtrl.SetImageList(m_pImgList,LVSIL_SMALL);
项目插入代码:
int nCurInsertRow = m_listCtrl.GetItemCount();
for (int i = 0; i < pItemDataVec->size(); ++i,nCurInsertRow++)
{
char fileName[16] = { 0 };
sprintf_s(fileName,16,"\\tmp%d.png",i + 1);
AddImage((filePath + fileName).c_str());
LVITEM lvItem = { 0 };
lvItem.mask = LVIF_IMAGE;
lvItem.iItem = nCurInsertRow;
lvItem.iImage = nCurInsertRow;
lvItem.iSubItem = 0;
m_listCtrl.InsertItem(&lvItem);
m_listCtrl.SetItemText(nCurInsertRow,1,pItemDataVec->at(i)->Data);
CString strTaoshu = "";
strTaoshu.Format(_T("%d"),Config::GetCalculationTaoshu());
m_listCtrl.SetItemText(nCurInsertRow,2,strTaoshu);
m_listCtrl.SetItemText(nCurInsertRow,3,pItemDataVec->at(i)->Remark);
m_pListItemDatas->push_back(new ListItemData(*pItemDataVec->at(i)));
delete pItemDataVec->at(i);
}
AddImage 函数的实现:
void CommonMsgDialog::AddImage(LPCSTR imagePath)
{
WCHAR path[512] = { 0 };
::MultiByteToWideChar(CP_ACP,(const char*)imagePath,strlen(imagePath),path,sizeof(path));
Gdiplus::Bitmap bmp(path);
#pragma region ratio calculation useless
int sourceHeight = bmp.GetHeight();
int sourceWidth = bmp.GetWidth();
float sourceRatio = sourceHeight / (float)sourceWidth;
float limitRatio = m_nPicHeight / (float)m_nPicWidth;
if (sourceRatio > limitRatio)
{
if (sourceHeight > m_nPicHeight)
{
sourceHeight = m_nPicHeight;
sourceWidth = sourceHeight / sourceRatio;
}
}
else
{
if (sourceWidth > m_nPicWidth)
{
sourceWidth = m_nPicWidth;
sourceHeight = sourceWidth * sourceRatio;
}
}
#pragma endregion
//设定缩略图的大小
Gdiplus::Bitmap* pThumbnail = (Gdiplus::Bitmap*)bmp.GetThumbnailImage(60,NULL,NULL);
HBITMAP hBmp;
pThumbnail->GetHBITMAP(Gdiplus::Color(256,256,256),&hBmp);
CBitmap* pImage = CBitmap::FromHandle(hBmp);
m_pImgList->Add(pImage,RGB(0,0));
// 下面的代码,如果没有,会产生内存泄漏
delete pThumbnail;
pThumbnail = NULL;
pImage->DeleteObject();
pImage->DeleteTempMap();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。