【问题标题】:Combobox with JPEG images带有 JPEG 图像的组合框
【发布时间】:2014-01-28 05:19:29
【问题描述】:

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

加载阶段:

...
    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::OutputBitmap(LPDRAWITEMSTRUCT lpDIS, bool selected)
{
    const CImage *image = (CImage*)GetItemDataPtr(lpDIS->itemID);
    if (image && image != (const CImage *)(0xffffffff)) 
    {
       CDC* pDC = CDC::FromHandle(lpDIS->hDC);
       CString string; 
       CPoint point;
       point.x = lpDIS->rcItem.left + 2;
       point.y = lpDIS->rcItem.top + ((lpDIS->rcItem.bottom - lpDIS->rcItem.top) / 2) - (m_nItemHeight / 2);
       DrawBitmap(image, pDC, point);
    }
}

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

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?

【问题讨论】:

  • 你错过了CImage::StretchBlt吗?
  • Weel,其实我还在用 CDC::StretchBlt... 我可以尝试一下

标签: c++ image visual-c++ visual-studio-2012 combobox


【解决方案1】:

您可以使用CBitmap::FromHandleCImage 转换为CBitmapCImage 类有一个operator HBITMAP(),所以它是可用的。

CBitmap::FromHandle

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

【讨论】:

  • 我已经做了这个尝试但是没有结果。后篇:BITMAP bm; ((CBitmap*)pBitmap)->GetBitmap(&bm);我看到 bm 不正确,因为它没有正确的图像宽度和高度值
  • 你的代码跟我不一样。您没有使用普通转换,因为您只是使用 CBitmap* 进行转换。
  • 什么类型的pBitmap?我在你的问题代码中找不到那个类型。
猜你喜欢
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2016-10-28
相关资源
最近更新 更多