重绘Ctreectrl (树控件 不同的item 不同的颜色)

1. 要求:CTreectrl控件里不同级别的item有不同的颜色,以区分不同类型。

2. 实现效果:

 3. 代码:

void CTreeCtrl4MS::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

// TODO: 在此添加控件通知处理程序代码

NMTVCUSTOMDRAW *ptvTreeCtrl=(NMTVCUSTOMDRAW *)pNMHDR;
LPNMTVCUSTOMDRAW pCustomDraw = (LPNMTVCUSTOMDRAW)pNMHDR;
if ( CDDS_PREPAINT == ptvTreeCtrl->nmcd.dwDrawStage )
{

*pResult = CDRF_NOTIFYITEMDRAW;
}

else if ( CDDS_ITEMPREPAINT == ptvTreeCtrl->nmcd.dwDrawStage )
{

COLORREF clrNewTextColor, clrNewBkColor;

HTREEITEM nItem = (HTREEITEM)(pCustomDraw->nmcd.dwItemSpec);


if( TREE_ITEM_IS_DEV == GetItemData(nItem))
{
ptvTreeCtrl->clrText=RGB(0,0,0);//字体颜色

}
else
{
ptvTreeCtrl->clrText=RGB(0,0,255);//字体颜色
}

CDC dc;

dc.Attach(ptvTreeCtrl->nmcd.hdc);
CFont Font;
dc.SelectObject(&Font);
dc.Detach();

*pResult =CDRF_DODEFAULT;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == ptvTreeCtrl->nmcd.dwDrawStage )
{

*pResult = CDRF_DODEFAULT;
}

}


几点说明:

1. 参数1转化为不同的类型(颜色帮助理解):

NMCUSTOMDRAW —— LPNMCUSTOMDRAW
NMTVCUSTOMDRAW —— LPNMTVCUSTOMDRAW
看定义:

typedef struct tagNMCUSTOMDRAWINFO
{
NMHDR hdr;
DWORD dwDrawStage;
HDC hdc;
RECT rc;
DWORD_PTR dwItemSpec; // this is control specific, but it's how to specify an item. valid only with CDDS_ITEM bit set
UINT uItemState;
LPARAM lItemlParam;
} NMCUSTOMDRAW, *LPNMCUSTOMDRAW;

typedef struct tagNMTVCUSTOMDRAW
{
NMCUSTOMDRAW nmcd;
COLORREF clrText;
COLORREF clrTextBk;
#if (_WIN32_IE >= 0x0400)
int iLevel;
#endif
} NMTVCUSTOMDRAW, *LPNMTVCUSTOMDRAW;

1. 结构体1是基础类型。结构体2是对1的封装,另外加上了两个COLORREF 类型的值。


2. 结构体命名中,

                        NM,表示:Notify Message
                    TV, 表示:Tree View
                        CUSTOMEDRAW: 表示自绘。


3. 通过对1的包装,可以有许多不同的结构体。如tagNMLVCUSTOMDRAW。其中的LV表示
List View。

 

4. 如何得到一个item。

 

HTREEITEM nItem = (HTREEITEM)(pCustomDraw->nmcd.dwItemSpec);

由结构体1可知,dwItemSpec是一个DWORD_PTR类型的数据

其中DWORD_PTR是一个无符号长整型。同时由于宏的作用,这个类型会根据平台是32
位的还是64位来改变自己的长度(就是定义变了)这个值可以用来存储一个地址(
因为地址也是一个整数),这时,DWORD_PTR就是一个指针。

HTREEITEM 是一个指针类型。

因此可以由dwItemSpec来得到一个item的句柄

5. 如何改变颜色。




posted on 2012-01-10 11:09  LateStop  阅读(4016)  评论(0)    收藏  举报

导航