如题,小弟在使用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);

解决方案 »

  1.   

    调试一下子,看看imageInfo中是否有值?
      

  2.   

    pPic1->SetBitmap(imageInfo.hbmImage);
      

  3.   

    IMAGEINFO imageInfo;
        m_imageList->GetImageInfo(0,&imageInfo);
    应该是GetImageInfo失败了吧另外你下面的SetBitmap的参数怎么写的是bmp?没有使用IMAGEINFO结构体中的成员变量
      

  4.   

    哎呀。。不好意思,我代码抄错了。。最后两句是:
    pPic1->SetBitmap(imageInfo.hbmImage);
        pPic2->SetBitmap(imageInfo.hbmImage);现在是在这样的代码上图片出不来
      

  5.   

    imageInfo中有值的,代码是我手打的,导致最后两句抄错了。。大家,帮忙看看,我实在不明白CImageList中能Add进去,可以关联到ListCtrl中显示,而为什么我不能直接获取它里面Add过的Bitmap呢?
      

  6.   

    加上| ILC_MASK试试
    Add(&bitmap,(COLORREF)0xFFFFFF)
      

  7.   

    现在改成以下这样,但还是不行 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);
      

  8.   

    你确定你的imageInfo里有指?
    IMAGEINFO imageInfo;
    m_imageList->GetImageInfo(0,&imageInfo);
    加上
    ASSERT(imageInfo.hbmImage);测试一下,看看出现断言吗
      

  9.   

    那幅图如果只是CBitmap去Load,然后来显示的话是正常的。。我刚刚把CImageList的Create方法中参数改成ILC_COLOR、ILC_COLOR8、ILC_COLOR16、ILC_COLOR32都试了一遍,结果还是不行
      

  10.   

    加上:
    BITMAP bmp;
    GetObject(imageInfo.hbmImage, sizeof(BITMAP), &bmp);
    看看对不对。
      

  11.   

    加上了,发现获得的bmp的bmWidth = 128是对的,但bmHeight怎么为1152呀?我的图原本都是128×128的;
    程序断点图如下:
      

  12.   

    再查查:
    HBITMAP hbmMask
      

  13.   


    是这样子么?
    HBITMAP hBmMask;
    GetObject(imageInfo.hbmImage, sizeof(HBITMAP), &hBmMask);这样获得的hBmMask地址是0xcccccccc
      

  14.   

    m_imageList->Create(128,128,ILC_COLOR24|ILC_MASK,8,8);
    应该有maskde,create有问题?
      

  15.   


    先谢谢这位仁兄一直热心的解答,
    不过难道CImageList不是这么Create的么?代码也就那么几行,我是放在一个简单的Dlg里的,大侠要是能抽点空亲手帮小弟调试一下,就好了
      

  16.   

    BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );查查这个BOOL
    另外搞一个小尺寸的(16,16)试试。
      

  17.   

    过年了。好久没来回复看过了。。我试了一下你说的,返回True,小尺寸(16,16)也不行;算了。。弄了这么久,我大概明白问题就在这个CImageList上,估计光通过imageInfo.hbmImage一个值是不行的,需要还原出真正的HBitmap句柄
      

  18.   

    我试了一下,是有问题:
    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);
      

  19.   

    最后是直接画在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);   
      

  20.   


    我按你这个一样的去试,但显示不出来呀??试了好几副图,自己画的也显示不出来
    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的方法,的确可以显示出来,但有问题,区域变大了,背景变黑。
      

  21.   

    图片每张都是128×128大小的,是BMP。ILC_COLOR选择我注意过了。。往往行不通各种位数(16、24、32)的我都会试一下的
      

  22.   

    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了,起作用了!
      

  23.   

    写成子程序:
    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);

    }
      

  24.   

    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是指设备环境颜色么?为什么不同会导致不同的结果呢
      

  25.   

    在资源中拖一个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中行,麻烦)
      

  26.   

    我想1》init:你懂吧
    2》OnButton1(); 是切换,0是red,1是green。这样‘如何使用ImageList就全了’。
    也祝你新年快乐