How to display different size images in MFC listControl report view

155 views Asked by At

I tried to display different size images in MFC ListControl report view along with the CImageList.But CImageList has it's own limitation which can only add same-sized images, some images are distorted.How can I display images whitout distortion?Any suggestion would be appreciated!

What I can do right now: enter image description here

as you can see, shape1 is badly distorted, shape2 seems like well displayed, because its ratio is close to CImageList size ratio;

Here is my CImageList creation code:

    // 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);

Item insertion code:

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);
    }

Implementation of AddImage function:

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();
}
0

There are 0 answers