如题,小弟在使用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);
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);
m_imageList->GetImageInfo(0,&imageInfo);
应该是GetImageInfo失败了吧另外你下面的SetBitmap的参数怎么写的是bmp?没有使用IMAGEINFO结构体中的成员变量
pPic1->SetBitmap(imageInfo.hbmImage);
pPic2->SetBitmap(imageInfo.hbmImage);现在是在这样的代码上图片出不来
Add(&bitmap,(COLORREF)0xFFFFFF)
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);
IMAGEINFO imageInfo;
m_imageList->GetImageInfo(0,&imageInfo);
加上
ASSERT(imageInfo.hbmImage);测试一下,看看出现断言吗
BITMAP bmp;
GetObject(imageInfo.hbmImage, sizeof(BITMAP), &bmp);
看看对不对。
程序断点图如下:
HBITMAP hbmMask
是这样子么?
HBITMAP hBmMask;
GetObject(imageInfo.hbmImage, sizeof(HBITMAP), &hBmMask);这样获得的hBmMask地址是0xcccccccc
应该有maskde,create有问题?
先谢谢这位仁兄一直热心的解答,
不过难道CImageList不是这么Create的么?代码也就那么几行,我是放在一个简单的Dlg里的,大侠要是能抽点空亲手帮小弟调试一下,就好了
另外搞一个小尺寸的(16,16)试试。
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);
// 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);
我按你这个一样的去试,但显示不出来呀??试了好几副图,自己画的也显示不出来
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的方法,的确可以显示出来,但有问题,区域变大了,背景变黑。
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了,起作用了!
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);
}
非常感谢你一直这么热心的帮我解决问题,真的很感动,你是我在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是指设备环境颜色么?为什么不同会导致不同的结果呢
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中行,麻烦)
2》OnButton1(); 是切换,0是red,1是green。这样‘如何使用ImageList就全了’。
也祝你新年快乐