动态生成位图,添加到CImageList供CListCtrl使用,两种方法,有一个不成功。

楼主yangl79(杨)2005-12-22 17:52:05 在 VC/MFC / 基础类 提问

方法一:  
  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位颜色以下使用时,还要  
  创建调色板,复杂度不可接受,而使用方法二就没有这个问题,所以我想使用方法二,请大家看看,方法二  
  的问题出在什么地方。 问题点数:100、回复次数:6Top

1 楼bobob(静思)回复于 2005-12-22 18:15:21 得分 0

晕,那么多资源没有释放Top

2 楼bobob(静思)回复于 2005-12-22 18:16:33 得分 0

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

3 楼dhttg(宇春秋)回复于 2005-12-22 19:10:49 得分 0

黑色矩形是没有成功的标志。里面点颜色的数据全部为0,显示出来的就是黑色的!Top

4 楼yangl79(杨)回复于 2005-12-22 19:18:59 得分 0

dingTop

5 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-12-22 23:19:31 得分 100

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);Top

6 楼yangl79(杨)回复于 2005-12-23 09:16:20 得分 0

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

你可能对以下的问题也比较感兴趣....