说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于CTreeCtrl中ITEM被选中的文本色设置问题

编辑:说三道四文库 发布时间:2018-08-20 03:04
HTML文档下载 WORD文档下载 PDF文档下载
Windows提供的CTreeCtrl控件中item默认情况下被选中的时候是用蓝色来表示选中状态的,我想自己设置选中的颜色,于是在网上查找了一些资料自己写了如下的程序:

void CMyTreeClass::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);
// TODO: Add your control notification handler code here
NMCUSTOMDRAW nmCustomDraw = pNMCD->nmcd;

switch(nmCustomDraw.dwDrawStage)
{
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
break;
}
case CDDS_ITEMPREPAINT:
{
pNMCD->clrText = RGB(255,255,0);
pNMCD->clrTextBk = RGB(255,0,0);
}
}
*pResult = 0;
*pResult |= CDRF_NOTIFYPOSTPAINT;
*pResult |= CDRF_NOTIFYITEMDRAW;
}

以上只能使得树中Item创建后的文本颜色为黄色,背景色为红色,小弟想请教下如何设置选中状态下的Item颜色??
判断一下uItemState项的值,如果uItemState&CDIS_SELECTED为TRUE就表示项被选中了。

case CDDS_ITEMPREPAINT: 

if(nmCustomDraw.uItemState & CDIS_SELECTED)
{
//设置选中时的颜色
}
else

pNMCD->clrText = RGB(255,255,0); 
pNMCD->clrTextBk = RGB(255,0,0); 

}

楼上的师兄,谢谢你了,可以了

其实刚刚我也是这么做的不过我在判断的时候用的不是 & 而是用的 == 再请教下你两者有什么区别,谢谢了
引用 3 楼 njlengjiang 的回复:
楼上的师兄,谢谢你了,可以了

其实刚刚我也是这么做的不过我在判断的时候用的不是 & 而是用的 == 再请教下你两者有什么区别,谢谢了


&是按位与, == 是完全等于。

例如 0x0101 & 0x0001 是true
但 0x0101 == 0x0001 就是false了
CDIS_SELECTED状态经常是和CDIS_FOCUS状态一起过来的,这两个状态按位或之后就变成
0x0011了,所以不等于CDIS_SELECTED的0x0001
这个我知道, 不过我刚刚再进行判断的时候发现使用
if(nmCustomDraw.uItemState & CDIS_SELECTED)
{
}
与使用
if(nmCustomDraw.uItemState == CDIS_SELECTED)
{
}
有区别,上面Item选中的时候程序可以跑进去,而后者不能,想问下为什么? Thanks
先备注一下
有大虾可以解释下吗?? 小弟在线等,先谢谢了
引用 4 楼 xylicon 的回复:
引用 3 楼 njlengjiang 的回复:
楼上的师兄,谢谢你了,可以了

其实刚刚我也是这么做的不过我在判断的时候用的不是 & 而是用的 == 再请教下你两者有什么区别,谢谢了


&是按位与, == 是完全等于。

例如 0x0101 & 0x0001 是true
但 0x0101 == 0x0001 就是false了


可能是这回事~谢谢了~
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘