带有JPEG图像的组合框 我有一个旧的VisualC++程序,其中所有者绘制的组合框中填充了位图图像。 我需要重写程序,使组合框能够加载jpeg或png而不是位图。 我已经阅读了有关CImage类的内容,因此我重写了将CBitmap更改为CImage的代码

带有JPEG图像的组合框 我有一个旧的VisualC++程序,其中所有者绘制的组合框中填充了位图图像。 我需要重写程序,使组合框能够加载jpeg或png而不是位图。 我已经阅读了有关CImage类的内容,因此我重写了将CBitmap更改为CImage的代码,c++,image,visual-c++,visual-studio-2012,combobox,C++,Image,Visual C++,Visual Studio 2012,Combobox,加载阶段: ... CImage image; image.Load(filepath); _ComboBoxBmp.AddImage(image,filename); ... 加载函数 void CComboBoxBmp::AddImage(CImage img, CString text) { int nIndex = GetCount(); CImage* image = new CImage; image->Attach(img.D

加载阶段:

...
    CImage image;
    image.Load(filepath);
    _ComboBoxBmp.AddImage(image,filename);
...
加载函数

void CComboBoxBmp::AddImage(CImage img, CString text)
{
    int nIndex = GetCount();
    CImage* image = new CImage;
    image->Attach(img.Detach());
    m_pBmpList.AddTail(image);

    int n = CComboBox::AddString(text);
    if (n != CB_ERR && n != CB_ERRSPACE)
    {
       int r = SetItemData(n, (DWORD)image);
       int Width = image->GetWidth();
       int Height = image->GetHeight();
       m_nItemWidth = 50*Width/100;
       m_nItemHeight = 50*Height/100;

       for (int i = -1; i < GetCount(); i++) 
          SetItemHeight(i, m_nItemHeight + 6);

    }
}
问题出现在最后一个函数中:

void CComboBoxBmp::DrawBitmap(const CImage *image, CDC *pDC, const CPoint &point)
{
    CDC memDC;
    memDC.CreateCompatibleDC((CDC*)pDC);

    BITMAP bm; 
    ((CBitmap*)bitmap)->GetBitmap(&bm);
    CBitmap *pBmp = memDC.SelectObject((CBitmap*)bitmap);
    pDC->StretchBlt(point.x, point.y, m_nItemWidth, m_nItemHeight, &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
    memDC.SelectObject(pBmp);

}
我不知道如何重写它,因为CDC::SelectObject接受CBitmap,但不接受CImages,而且在多次尝试后,我只能从组合框中获得一个包含所有空白图像的下拉列表


任何人都可以为CImage类找到类似的函数SelectObject?

您可以使用
CBitmap::FromHandle
CImage
转换为
CBitmap
CImage
类有一个
操作符HBITMAP()
,因此它是可用的


我已经做好了准备​​这是一次尝试,但没有结果。在paert之后:位图bm;((CBitmap*)pBitmap)->GetBitmap(&bm);我发现bm是不正确的,因为它并没有正确的图像宽度和高度值。你们的代码和我不一样。您没有使用普通转换,因为您只是使用CBitmap*进行转换。什么类型的pBitmap?我在你的问题代码中找不到这种类型。你错过了吗?Weel,实际上我还在使用CDC::StretchBlt。。。我可以试一下
void CComboBoxBmp::DrawBitmap(const CImage *image, CDC *pDC, const CPoint &point)
{
    CDC memDC;
    memDC.CreateCompatibleDC((CDC*)pDC);

    BITMAP bm; 
    ((CBitmap*)bitmap)->GetBitmap(&bm);
    CBitmap *pBmp = memDC.SelectObject((CBitmap*)bitmap);
    pDC->StretchBlt(point.x, point.y, m_nItemWidth, m_nItemHeight, &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
    memDC.SelectObject(pBmp);

}
CImage image;
// ...
CBitmap* pBitmap = CBitmap::FromHandle(image);