CTreeCtrl加ICON图标的代码片段如下:
这里要注意:Create的第二个参数
(1)颜色深度一定要选择正确eg,ILC_COLOR32
(2)或上掩码处理ILC_MASK,对ICON来说会使得其黑色的背景透明
m_imgList.Create(16,16,ILC_COLOR32|ILC_MASK,2,0);
m_imgList.Add(AfxGetApp()->LoadIcon(IDI_ICON_PLUS));
m_imgList.Add(AfxGetApp()->LoadIcon(IDI_ICON_MINUS));
m_tree.SetImageList(&m_imgList,TVSIL_NORMAL);
m_tree.InsertItem(_T("root"));
CTreeCtrl控件中的CimageList插入一个图标为什么显示成黑色呢
我在Dialog中方了一个CTreeCtrl控件,按照需要插入节点,但是我的程序中节点能够插入,但是节点的图标都是黑的,各位大侠给看看错在哪里?
void CClassTreeCtrl::AddImage(const COLORREF& dwColor)
{
BYTE color3[3];
color3[0] = GetRValue(dwColor);
color3[1] = GetGValue(dwColor);
color3[2] = GetBValue(dwColor);
CBitmap bitmap;
BYTE* lpBits=NULL;
lpBits = new BYTE[16*16*3];
for (int i=0;i <16*16;i++)
{
for (int j=0;j <3;j++)
{
*(lpBits+i+j) = color3[j];
}
}
bitmap.CreateBitmap(16,16,1,24,lpBits);
CImageList* pImgList = this-> GetImageList(TVSIL_NORMAL);
pImgList-> Add(&bitmap,RGB(255,255,255));
//////////////////////////////////////////////////////////////////
int nImgCount = pImgList-> GetImageCount();
this-> InsertItem(strClassName,nImgCount-1,1,TVI_ROOT);
//////////////////////////////////////////////////////////////////
delete lpBits;
lpBits=NULL;
}
但是发现ctreectrl中增加的这个节点的图为黑色的,请问什么原因
------解决方案--------------------
试试:
void CClassTreeCtrl::AddImage(const COLORREF& dwColor)
{
CPaintDC dc(this);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(&dc,16,16);
CDC myDC;
myDC.CreateCompatibleDC(&dc);
CBitmap *pOldBitmap = myDC.SelectObject(m_bitmap);
CBrush mybrush(dwColor);
myDC.FillRect(&rc,&mybrush);
myDC.SelectObject(pOldBitmap);
myDC.DeleteDC();
CImageList* pImgList = this-> GetImageList(TVSIL_NORMAL);
pImgList-> Add(&bitmap,RGB(255,255,255));
bitmap.Detach();
//////////////////////////////////////////////////////////////////
int nImgCount = pImgList-> GetImageCount();
this-> InsertItem(strClassName,nImgCount-1,1,TVI_ROOT);
//////////////////////////////////////////////////////////////////
}
前面提到了CImageList类的Create(...)函数,虽然MSDN上已经有所解释,但仍有网友问到参数的具体含义,下面就我的理解,对参数进行一次轻量级的剖析
函数原型(其他重载函数请参看msdn):
BOOL Create(
int cx,
int cy,
UINT nFlags,
int nInitial,
int nGrow
);
cx ,cy:
图片的实际像素宽与高,没有问题
nFlags:
创建图像列表的类型,包括4/8/16/24/32/位色,
nInitial :
创建ImageList初始包括的图像个数
nGrow
当初始分配的图像个数不够的时候,新增一个图片时,指定图象列表能增加的新图象个数,图像列表空间不够而继续添加image时,将按照nGrow继续分配空间,设计时根据具体情况设置合适的值,避免内存频繁的改变图像列表而過度頻繁而使系統记忆体碎片化
例如
nInitial = 2,nGrow=3
当你添加了两个图像元素以后,还想添加第三个的时候,初始创建分配的nInitial已经使用完了,此时,系统会根据nGrow,为自动增大Imagelist3个元素容量,此时我们的Imagelist就可以容纳5个图像元素了,如果5个使用完毕后,会继续按照nGrow进行再分配,类似于一个可变数组,但参数到底设置多少,还是要根据实际的情况设置合理的值,一要避免浪费空间,又要避免频繁的对Image容器进行resize操作