方法一:
HIMAGELIST hList = ImageList_Create(12, 12, /*ILC_COLOR32*/ILC_COLORDDB, 4, 4);
m_ImageList.Attach(hList);
long pData[12 * 12];
BITMAP BitMap;
BitMap.bmType = 0;
BitMap.bmHeight = BitMap.bmWidth = 12;
BitMap.bmWidthBytes = 4 * 12;
BitMap.bmPlanes = 1;
BitMap.bmBitsPixel = 32;
BitMap.bmBits = pData;
for (int i = 0; i < 12 * 12; i++)
pData[i] = 255; //一个蓝色的矩形
TempBitmap.CreateBitmapIndirect(&BitMap);
m_ImageList.Add(&TempBitmap, (CBitmap*) 0);
m_ListCtrl.SetImageList(&m_ImageList, LVSIL_SMALL);
m_ListCtrl.InsertItem(0, "123", 0);
m_ListCtrl.SetItemText(0, 1, "456");方法二:
HIMAGELIST hList = ImageList_Create(12, 12, /*ILC_COLOR32*/ILC_COLORDDB, 4, 4);
m_ImageList.Attach(hList);
CDC* pDC = GetDC();
CBitmap TempBitmap;
TempBitmap.CreateCompatibleBitmap(pDC, 12, 12);
CDC dc;
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&TempBitmap);
CBrush brush;
brush.CreateSolidBrush(RGB(0, 255, 0)); //一个绿色的刷子
RECT rect;
rect.left = rect.top = 0;
rect.right = rect.bottom = 12;
dc.FillRect(&rect, &brush);
ReleaseDC(pDC);
m_ImageList.Add(&TempBitmap, (CBitmap*) 0);
m_ListCtrl.SetImageList(&m_ImageList, LVSIL_SMALL);
m_ListCtrl.InsertItem(0, "123", 0);
m_ListCtrl.SetItemText(0, 1, "456");方法二不成功(位图是绝对绘制成功了的,我试过把TempBitmap用BitBlt绘制出来,成功),表现为显示是一个
黑色的矩形,不管绘制的时候颜色如何改变,它都显示为一黑色矩形。
方法一虽然成功,但如果用户使用非32位颜色时显示也不正常,而且当用户在低为24位颜色以下使用时,还要
创建调色板,复杂度不可接受,而使用方法二就没有这个问题,所以我想使用方法二,请大家看看,方法二
的问题出在什么地方。

解决方案 »

  1.   

    TempBitmap.CreateCompatibleBitmap(pDC, 12, 12);
    没有释放
    dc.CreateCompatibleDC(pDC);
    没有释放
    brush.CreateSolidBrush(RGB(0, 255, 0)); 
    没有释放
      

  2.   

    1.位图绘制完毕应该从DC中选出来
    dc.CreateCompatibleDC(pDC);
    CBitmap* pOld = (CBitmap* )dc.SelectObject(&TempBitmap);
    CBrush brush;
    brush.CreateSolidBrush(RGB(0, 255, 0)); //一个绿色的刷子
    RECT rect;
    rect.left = rect.top = 0;
    rect.right = rect.bottom = 12;
    dc.FillRect(&rect, &brush);
    dc.SelectObject(pOld);
    2.ImageList_Create(12, 12, /*ILC_COLOR32*/ILC_COLORDDB, 4, 4);我觉得应改为ImageList_Create(12, 12, /*ILC_COLOR32*/ILC_COLORDDB, 0, 1);
      

  3.   

    ImageList_Create函数的后两个参数一个是初始化位图的个数(只是空间,实际位图的个数要看添加了多少),第二个参数是空间不够的时候,一次性再次分配的空间。所以前一个只要大于等于0,后一个只要大于0即可,我已调试过了,他们只是影响空间分配的次数。非常感谢goodboyws(深夜不眠者),问题已解决,就是把位图选出设备即可,开始我以为是局部变量,所以没有选出设备。