重绘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. 如何改变颜色。
浙公网安备 33010602011771号