1

我尝试在 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();
}
4

0 回答 0