动态生成位图,添加到CImageList供CListCtrl使用,两种方法,有一个不成功。
方法一:
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