我尝试在 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("数据"), LVCFMT_CENTER, width2, -1);
m_listCtrl.InsertColumn(2, _T("套数"), LVCFMT_CENTER, width, -1);
m_listCtrl.InsertColumn(3, _T("备注"), LVCFMT_CENTER, width2, -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, 0, (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, 30, NULL, NULL);
HBITMAP hBmp;
pThumbnail->GetHBITMAP(Gdiplus::Color(256, 256, 256), &hBmp);
CBitmap* pImage = CBitmap::FromHandle(hBmp);
m_pImgList->Add(pImage, RGB(0, 0, 0));
// 下面的代码,如果没有,会产生内存泄漏
delete pThumbnail;
pThumbnail = NULL;
pImage->DeleteObject();
pImage->DeleteTempMap();
}