一步一步教你实现CTreeCtrl 自绘( 三 )


dc.BitBlt( m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), &MemeDc, 0, 0,SRCCOPY);MemeDc.SelectObject(pOldBitmap);MemeDc.DeleteDC();}
可以看见我们在函数中首先绘制了背景然后再背景上绘制了控件 。具体的函数实现请看下面的介绍 。
在这里我们基本的东西已经具备了现在我们就差数据了,首先我们要实现我们最开始的那种效果,我们需要定义一个结构体来存储这些数据 。
int ; //第一张图片的信息
int ; //第二张图片的信息
int ;//第三张图片的信息
int ; //第四张图片的信息
;//文字的颜色
int ; //人的数目
;//每一项的文字
;//每一项对应的URL地址

我们在定义一个map
map; 这是为了我们以后的绘制和判断热点用 。
有了数据结构,我们现在就可以插入数据使之成为一颗拥有节点的数,这个插入我们也需要自己重写,因为插入的数据是我们自己定义的 。
HTREEITEM CMyCtreeCtrl::InsertItemEx(TREE_STRUCT pStruct,HTREEITEM lparent,HTREEITEMlpFont )//插入项{HTREEITEM tempTreeItem;CString str;str.Format("%s(%d人)",pStruct.s_ItemStr,pStruct.s_PeopleNum);tempTreeItem = InsertItem(str,lparent,lpFont);m_mapTree.insert(pair(tempTreeItem,pStruct));returntempTreeItem;}
下面是绘制树形控件的具体实现
void CMyCtreeCtrl::DrawItem(CDC* pDc){HTREEITEM currentItem,parentItem;//当前的句柄,和它的父节点的句柄DWORDtreeStyle;// 数的类型CRectitemRect;//每一项的区域intitemState;//某项的状态//bool selected;//True:表示是需要高亮 ImageAttributes alphaAttribut; alphaAttribut.SetColorKey(Color::Fuchsia,Color::Fuchsia); treeStyle =:: GetWindowLong( m_hWnd, GWL_STYLE );
currentItem = GetFirstVisibleItem();//获取第一个课可见的项do {if (GetItemRect(currentItem,itemRect,TRUE)){itemRect.left=itemRect.left-19;CRectfillRect(0,itemRect.top,m_ClientRect.right,itemRect.bottom);itemState = GetItemState(currentItem,TVIF_STATE);if (itemRect.top>m_ClientRect.bottom)//说明这一项已超出窗口的边界,所以不绘制,很好理解吧!不用我说了撒{break;}//绘制鼠标热点if (currentItem==m_MouseMoveItem&&ItemHasChildren(currentItem)==NULL){m_Gdiplus.usFillRectangle(pDc->m_hDC,fillRect,0xB7F0FE,0xB7F0FE,edoVertical,true);}if(itemState&TVIS_SELECTED){m_Gdiplus.usFillRectangle(pDc->m_hDC,fillRect,0xFF00BB,0xFF00BB,edoVertical,true);}//绘制展开图片if (ItemHasChildren(currentItem)){CPoint point;point.x = itemRect.left;point.y = itemRect.top+(itemRect.Height()-m_OpenHigh)/2;if (itemState & TVIS_EXPANDED){m_IconList.Draw(pDc,1,point,ILD_TRANSPARENT);}else{m_IconList.Draw(pDc,0,point,ILD_TRANSPARENT);}}itemRect.left+=m_OpenWidth+2;itemRect.right+=m_OpenWidth+8;//绘制图标1m_iter=m_mapTree.find(currentItem);Graphics tempGraphics(pDc->m_hDC);Rect rcDes;if (m_iter->second.s_FirstImage>=0&&m_iter->second.s_FirstImagesecond.s_FirstImage*m_IconWidt,0,m_IconWidt,m_IconHigh,UnitPixel,&alphaAttribut);itemRect.left =itemRect.left+m_IconWidt;itemRect.right = itemRect.right+m_IconWidt;}
//绘制文字DrawItemText(pDc,currentItem,itemRect);//绘制后面的第2,3,4项图标CSizefontSize;fontSize= pDc->GetTextExtent(GetItemText(currentItem));itemRect.left+=fontSize.cx;if (m_iter->second.s_SecondImage>=0&&m_iter->second.s_SecondImagesecond.s_SecondImage*m_IconWidt,0,m_IconWidt,m_IconHigh,UnitPixel,&alphaAttribut);itemRect.left=itemRect.left+m_IconWidt+4;}}} while ((currentItem=GetNextVisibleItem(currentItem)) != NULL);}