带有 JPEG 图像的组合框
Combobox with JPEG images
我有一个旧的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?
您可以使用
CBitmap::FromHandle
从CImage
转换为CBitmap
。 CImage
类有一个operator HBITMAP()
,所以它是可用的。
CBitmap::FromHandle
CImage image;
// ...
CBitmap* pBitmap = CBitmap::FromHandle(image);
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 可组合的lambda/std::函数与std::可选
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 平均图像时图像损坏
- 混合组合和继承的C++问题
- OpenCV C++将灰色图像组合成彩色图像
- 如何组合许多连续的图像来模拟逼真的运动模糊?
- 如何使用任何编程语言组合序列中的多个图像
- 使用 ffmpeg 将平面 RGB 图像组合成无损视频
- 在win API中带有图像和整行选择的组合框
- 带有 JPEG 图像的组合框
- 如何在 Matlab/ C++ 中组合具有不同增益的两个图像
- 组合图像中重叠的组
- 基于黑白蒙版组合两幅图像
- 使用framebuffer对象组合图像
- QT-有没有将几个图像组合成一个的类