如何从CImageList对象中获取已加载的bitmap信息用于别处加载?

上岸の鱼 2011-01-26 04:20:00
如题,小弟在使用CImageList对象使用Add方法加载Bitmap位图后,之后想再从这个CImageList对象中获取位图,去加载到一个Picture Ctrl中,但不知道为何都失败了,所以想问下大家如何再从CImageList中获取已经Add过的位图呀?

代码如下:

CImageList* m_imageList = new CImageList;
m_imageList->Create(128,128,ILC_COLOR24,8,8);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
m_imageList->Add(&bmp,RGB(0,0,0));

//以下写法是为了测试从CImageList中获取的Bitmap
IMAGEINFO imageInfo;
m_imageList->GetImageInfo(0,&imageInfo);
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);//Picture Ctrl
CStatic* pPic2 = (CStatic*)GetDlgItem(IDC_PIC2);//Picture Ctrl
pPic1->SetBitmap(bmp);
pPic2->SetBitmap(bmp);


...全文
504 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2011-02-11
  • 打赏
  • 举报
回复
sorry,没好好测试,pic1初始化是red,以为可以,其实没作用,只好改成:

// TODO: Add extra initialization here
m_imageList.Create(128,128,ILC_COLOR32,1,1);
m_bmp.LoadBitmap(IDB_BITMAP2);//green
int at=m_imageList.Add(&m_bmp,(COLORREF)0x0);
// make a bitmap for the pic1
CDC *pDC=GetDC();
m_PicBm.CreateCompatibleBitmap(pDC,128,128);
//
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC) ;
//
CBitmap *pBmpOld = dcMemory.SelectObject(&m_PicBm);
//
m_imageList.Draw(&dcMemory,at,CPoint(0,0),ILD_NORMAL);
// m_imageList.DrawIndirect() ??
dcMemory.SelectObject(pBmpOld);
dcMemory.DeleteDC();
ReleaseDC(pDC);
//
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
pPic1->SetBitmap((HBITMAP)m_PicBm);

这次red改为green了,起作用了!
上岸の鱼 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 bai_hua_lin 的回复:]
楼主你的图片到底什么尺寸啊?你说的128×128,是不是这些图都在一个位图资源中啊。如果是这样的话,你在选择那个掩码颜色的时候应该注意了,这个颜色应该是你这些图之间的隔离颜色。
[/Quote]
图片每张都是128×128大小的,是BMP。ILC_COLOR选择我注意过了。。往往行不通各种位数(16、24、32)的我都会试一下的
bai_hua_lin 2011-02-11
  • 打赏
  • 举报
回复
楼主你的图片到底什么尺寸啊?你说的128×128,是不是这些图都在一个位图资源中啊。如果是这样的话,你在选择那个掩码颜色的时候应该注意了,这个颜色应该是你这些图之间的隔离颜色。
上岸の鱼 2011-02-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 schlafenhamster 的回复:]
最后是直接画在pic上不用setbitmap :
// TODO: Add extra initialization here
m_imageList.Create(128,128,ILC_COLOR32,1,1);
m_bmp.LoadBitmap(IDB_BITMAP1);
int at=m_imageList.Add(&m_bmp,(COLORREF)0x0);
// ……
[/Quote]

我按你这个一样的去试,但显示不出来呀??试了好几副图,自己画的也显示不出来
m_imageList->Create(128,128,ILC_COLOR32,1,1);
m_bmp.LoadBitmap(IDB_BITMAP1);
int at=m_imageList->Add(&m_bmp,(COLORREF)0x0);
// good !
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
CDC *pDC = pPic1->GetDC();
m_imageList->Draw(pDC,at,CPoint(0,0),ILD_NORMAL);
pPic1->ReleaseDC(pDC);

MSDN上Draw的解释是: Draws the image that is being dragged during a drag-and-drop operation.不会是在拖拽时才会画出来吧?


而按上面那个COPYImage的方法,的确可以显示出来,但有问题,区域变大了,背景变黑。
上岸の鱼 2011-02-11
  • 打赏
  • 举报
回复
恩。。"被覆盖"了。。我明白了。。呵呵,非常感谢。。结贴了
schlafenhamster 2011-02-11
  • 打赏
  • 举报
回复
我想1》init:你懂吧
2》OnButton1(); 是切换,0是red,1是green。这样‘如何使用ImageList就全了’。
也祝你新年快乐
schlafenhamster 2011-02-11
  • 打赏
  • 举报
回复
在资源中拖一个pic时,我给他初始化为IDB_BITMAP1 red了,程序运行时能见到这个red,所以以为对了。其实是:
good !
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
CDC *pDC = pPic1->GetDC();
m_imageList->Draw(pDC,at,CPoint(0,0),ILD_NORMAL);
pPic1->ReleaseDC(pDC);
这几句不起作用,或被覆盖了(也许放paint中行,麻烦)
上岸の鱼 2011-02-11
  • 打赏
  • 举报
回复
TO: schlafenhamster
非常感谢你一直这么热心的帮我解决问题,真的很感动,你是我在CSDN上提问时遇到的最好最认真和热心的人了,顺便问候一下,新年快乐。

按上面的方法试成功了。。剩下一个小疑问,我对GDI不算太熟,顺便问一下,嘿嘿
你在上面说之前pic1初始化是red,后来改为green了这句话我是这么理解的,不知道对不对?
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
CDC *pDC = pPic1->GetDC();//这样导致red?

CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC) ;
CBitmap *pBmpOld = dcMemory.SelectObject(&m_PicBm);//这样出来就是green?

最后这个red和green是指设备环境颜色么?为什么不同会导致不同的结果呢



schlafenhamster 2011-02-11
  • 打赏
  • 举报
回复
写成子程序:
1》init:
// TODO: Add extra initialization here
m_imageList.Create(IMAGE_WID,IMAGE_HEI,ILC_COLOR32,2,1);
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);//red
m_imageList.Add(&bmp,(COLORREF)0x0);
bmp.DeleteObject();
//
bmp.LoadBitmap(IDB_BITMAP2);//green
m_imageList.Add(&bmp,(COLORREF)0x0);
bmp.DeleteObject();
2》OnButton1(); switch bmp BTW. red and green
void CBigImageDlg::OnButton1()
{
// TODO: Add your control notification handler code here
static int now=0;
now++;
now %=2;
// make a bitmap for the pic1
CDC *pDC=GetDC();
if(!(HBITMAP)m_PicBm)
{
//afxDump << "Init \n";
m_PicBm.CreateCompatibleBitmap(pDC,IMAGE_WID,IMAGE_HEI);
}
//
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC) ;
//
CBitmap *pBmpOld = dcMemory.SelectObject(&m_PicBm);
//
m_imageList.Draw(&dcMemory,now,CPoint(0,0),ILD_NORMAL);
//
dcMemory.SelectObject(pBmpOld);
dcMemory.DeleteDC();
ReleaseDC(pDC);
//
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
pPic1->SetBitmap((HBITMAP)m_PicBm);

}
schlafenhamster 2011-02-10
  • 打赏
  • 举报
回复
我试了一下,是有问题:
m_imageList.Create(128,128,ILC_COLOR4|ILC_MASK,1,0);
m_bmp.LoadBitmap(IDB_BITMAP1);
int at=m_imageList.Add(&m_bmp,(COLORREF)0xFFFFFF);
IMAGEINFO imageInfo;
m_imageList.GetImageInfo(at,&imageInfo);
HBITMAP hBitmap=(HBITMAP)CopyImage(imageInfo.hbmImage,IMAGE_BITMAP,0,0, LR_COPYRETURNORG);

BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);

CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
pPic1->SetBitmap(hBitmap);
上岸の鱼 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 schlafenhamster 的回复:]
BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );

查查这个BOOL
另外搞一个小尺寸的(16,16)试试。
[/Quote]
过年了。好久没来回复看过了。。我试了一下你说的,返回True,小尺寸(16,16)也不行;

算了。。弄了这么久,我大概明白问题就在这个CImageList上,估计光通过imageInfo.hbmImage一个值是不行的,需要还原出真正的HBitmap句柄
schlafenhamster 2011-02-10
  • 打赏
  • 举报
回复
最后是直接画在pic上不用setbitmap :
// TODO: Add extra initialization here
m_imageList.Create(128,128,ILC_COLOR32,1,1);
m_bmp.LoadBitmap(IDB_BITMAP1);
int at=m_imageList.Add(&m_bmp,(COLORREF)0x0);
// good !
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
CDC *pDC = pPic1->GetDC();
m_imageList.Draw(pDC,at,CPoint(0,0),ILD_NORMAL);
pPic1->ReleaseDC(pDC);
schlafenhamster 2011-01-28
  • 打赏
  • 举报
回复
m_imageList->Create(128,128,ILC_COLOR24|ILC_MASK,8,8);
应该有maskde,create有问题?
上岸の鱼 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 schlafenhamster 的回复:]
再查查:
HBITMAP hbmMask
[/Quote]

是这样子么?
HBITMAP hBmMask;
GetObject(imageInfo.hbmImage, sizeof(HBITMAP), &hBmMask);

这样获得的hBmMask地址是0xcccccccc
schlafenhamster 2011-01-28
  • 打赏
  • 举报
回复
BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );

查查这个BOOL
另外搞一个小尺寸的(16,16)试试。
上岸の鱼 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 schlafenhamster 的回复:]
m_imageList->Create(128,128,ILC_COLOR24|ILC_MASK,8,8);
应该有maskde,create有问题?
[/Quote]

先谢谢这位仁兄一直热心的解答,
不过难道CImageList不是这么Create的么?代码也就那么几行,我是放在一个简单的Dlg里的,大侠要是能抽点空亲手帮小弟调试一下,就好了
schlafenhamster 2011-01-27
  • 打赏
  • 举报
回复
是不是static不支持24位的?
上岸の鱼 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
你确定你的imageInfo里有指?
IMAGEINFO imageInfo;
m_imageList->GetImageInfo(0,&imageInfo);
加上
ASSERT(imageInfo.hbmImage);测试一下,看看出现断言吗
[/Quote]
大侠,请相信小弟。。我把图发上来


Eleven 2011-01-27
  • 打赏
  • 举报
回复
你确定你的imageInfo里有指?
IMAGEINFO imageInfo;
m_imageList->GetImageInfo(0,&imageInfo);
加上
ASSERT(imageInfo.hbmImage);测试一下,看看出现断言吗
上岸の鱼 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 schlafenhamster 的回复:]
加上| ILC_MASK试试
Add(&bitmap,(COLORREF)0xFFFFFF)
[/Quote]
现在改成以下这样,但还是不行

m_imageList->Create(128,128,ILC_COLOR24|ILC_MASK,8,8);
m_bmp.LoadBitmap(IDB_BITMAP1);
m_imageList->Add(&m_bmp,(COLORREF)0xFFFFFF);

IMAGEINFO imageInfo;
m_imageList->GetImageInfo(0,&imageInfo);
CStatic* pPic1 = (CStatic*)GetDlgItem(IDC_PIC1);
CStatic* pPic2 = (CStatic*)GetDlgItem(IDC_PIC2);
pPic1->SetBitmap(imageInfo.hbmImage);
pPic2->SetBitmap(imageInfo.hbmImage);
加载更多回复(10)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧