CTreeCtrl失去焦点后高亮选中项

来源:互联网 发布:四则运算算法实现 编辑:程序博客网 时间:2024/05/21 12:07
CTreeCtrl失去焦点后高亮选中项

       在VC++编程中,CTreeCtrl是使用最多的一种控件,由于MFC中包含了太多的宏,并且注释也不够仔细,这导致了我们在对控件进行扩展或重绘时都有一定的难度。对于CTreeCtrl可以在进行Create()函数时,添加Style类型TVS_SHOWSELALWAYS,保证在失去焦点时依旧高亮,但是高亮不够明显,呈灰颜色。为了解决这个问题,我们需要对其进行重绘。重绘函数如下,可以通过MFC中的类向导来创建该函数:

void CTreeCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult){    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);    // TODO: 在此添加控件通知处理程序代码    *pResult = 0;    LPNMTVCUSTOMDRAW pDraw=(LPNMTVCUSTOMDRAW)pNMHDR;    DWORD dwDrawStage=pDraw->nmcd.dwDrawStage;    UINT uItemState =pDraw->nmcd.uItemState;       *pResult=CDRF_NOTIFYITEMDRAW;    CDC* pdc=CDC::FromHandle(pDraw->nmcd.hdc);    CRect rc;    HTREEITEM hItem=(HTREEITEM) pDraw->nmcd.dwItemSpec;    m_tree.GetItemRect(hItem,&rc,TRUE);//FALSE);text only    CString txt=m_tree.GetItemText(hItem);    if((dwDrawStage & CDDS_ITEM) && (uItemState & CDIS_SELECTED))    {//         pdc->FillSolidRect(&rc,RGB(100,53,255));//clr);        //        pdc->SetTextColor(RGB(255,255,255));//white        pdc->SetBkColor(RGB(100,53,255));//clr);        CFont* pfnt=pdc->GetCurrentFont();        //        pdc->TextOut(rc.left+2,rc.top+2,txt);        pdc->SelectObject(pfnt);        *pResult = CDRF_NOTIFYITEMDRAW;    }    else // without these ,1st blue !    {        pdc->FillSolidRect(&rc, GetSysColor(COLOR_WINDOW));        pdc->SetTextColor(GetSysColor(COLOR_WINDOWTEXT));        pdc->TextOut(rc.left+2, rc.top+2, txt);    }}

通过该函数的重绘就可以保证即使树控件失去焦点时,依旧保持节点高亮状态。

0 0