CTreeCtrl、同一item、文本呈现不同颜色的有关问题,多谢(100)
CTreeCtrl、同一item、文本呈现不同颜色的问题,谢谢(100)
如图所示,
- C盘:
+ 360Rec
+ Documents
对于同一个tree-item,想让其文本呈现不同的颜色,
比如:"360Rec"那个item,呈现效果是:360(红色显示),Rec(黑色显示)。
如何实现?
------------------------------------
有试过响应NM_CUSTOMDRAW,不知道怎么做好,整个item使用同一颜色倒是好弄。
总不能整个item("360Rec")全部自绘吧(像节点间的连线、item前的图标,要是自绘的画就有的麻烦了)??
------解决方案--------------------
http://blog.csdn.net/hurryboylqs/article/details/5548605
------解决方案--------------------
自绘TreeCtrl控件可以实现你的效果..。
------解决方案--------------------
只自绘text
------解决方案--------------------
估计你的全自绘了
怕麻烦可以找一个现成的改改
------解决方案--------------------
发过去了,希望对你学习界面的自绘有帮助...
------解决方案--------------------
大概是:
void CTreectrlDlg::OnCustDrawTree(NMHDR *pNMHDR,LRESULT *pResult)
{
LPNMTVCUSTOMDRAW pDraw=(LPNMTVCUSTOMDRAW)pNMHDR;
DWORD dwDrawStage=pDraw->nmcd.dwDrawStage;
UINT uItemState =pDraw->nmcd.uItemState;
//
*pResult=CDRF_NOTIFYITEMDRAW;
//|CDRF_NOTIFYPOSTPAINT|CDRF_NOTIFYSUBITEMDRAW|CDRF_NOTIFYPOSTERASE;
CDC* pdc=CDC::FromHandle(pDraw->nmcd.hdc);
HTREEITEM hSelect=m_Tree.GetSelectedItem();
//
HTREEITEM hItem=(HTREEITEM) pDraw->nmcd.dwItemSpec;
// label only !
if((dwDrawStage & CDDS_ITEM) && (hItem==hSelect))// not (uItemState & CDIS_SELECTED))
{//
CRect rc;
m_Tree.GetItemRect(hItem,&rc,TRUE);//FALSE);text only
CString txt=m_Tree.GetItemText(hItem);
pdc->FillSolidRect(&rc,RGB(255,0,0));//clr);
//
pdc->SetTextColor(RGB(255,255,255));//white
pdc->SetBkColor(RGB(255,0,0));//clr);
//
pdc->TextOut(rc.left+2,rc.top+2,"360");
pdc->TextOut(rc.left+26,rc.top+2,"rec");
*pResult |= CDRF_SKIPDEFAULT;// there are also image, box ...
}
}
------解决方案--------------------
只绘text也行,image,box还让它自己画。下面的方法也可用于其它控件的个性绘制。
方法如下:
如图所示,
- C盘:
+ 360Rec
+ Documents
对于同一个tree-item,想让其文本呈现不同的颜色,
比如:"360Rec"那个item,呈现效果是:360(红色显示),Rec(黑色显示)。
如何实现?
------------------------------------
有试过响应NM_CUSTOMDRAW,不知道怎么做好,整个item使用同一颜色倒是好弄。
总不能整个item("360Rec")全部自绘吧(像节点间的连线、item前的图标,要是自绘的画就有的麻烦了)??
------解决方案--------------------
http://blog.csdn.net/hurryboylqs/article/details/5548605
------解决方案--------------------
自绘TreeCtrl控件可以实现你的效果..。
------解决方案--------------------
只自绘text
------解决方案--------------------
估计你的全自绘了
怕麻烦可以找一个现成的改改
------解决方案--------------------
发过去了,希望对你学习界面的自绘有帮助...
------解决方案--------------------
大概是:
void CTreectrlDlg::OnCustDrawTree(NMHDR *pNMHDR,LRESULT *pResult)
{
LPNMTVCUSTOMDRAW pDraw=(LPNMTVCUSTOMDRAW)pNMHDR;
DWORD dwDrawStage=pDraw->nmcd.dwDrawStage;
UINT uItemState =pDraw->nmcd.uItemState;
//
*pResult=CDRF_NOTIFYITEMDRAW;
//|CDRF_NOTIFYPOSTPAINT|CDRF_NOTIFYSUBITEMDRAW|CDRF_NOTIFYPOSTERASE;
CDC* pdc=CDC::FromHandle(pDraw->nmcd.hdc);
HTREEITEM hSelect=m_Tree.GetSelectedItem();
//
HTREEITEM hItem=(HTREEITEM) pDraw->nmcd.dwItemSpec;
// label only !
if((dwDrawStage & CDDS_ITEM) && (hItem==hSelect))// not (uItemState & CDIS_SELECTED))
{//
CRect rc;
m_Tree.GetItemRect(hItem,&rc,TRUE);//FALSE);text only
CString txt=m_Tree.GetItemText(hItem);
pdc->FillSolidRect(&rc,RGB(255,0,0));//clr);
//
pdc->SetTextColor(RGB(255,255,255));//white
pdc->SetBkColor(RGB(255,0,0));//clr);
//
pdc->TextOut(rc.left+2,rc.top+2,"360");
pdc->TextOut(rc.left+26,rc.top+2,"rec");
*pResult |= CDRF_SKIPDEFAULT;// there are also image, box ...
}
}
------解决方案--------------------
只绘text也行,image,box还让它自己画。下面的方法也可用于其它控件的个性绘制。
方法如下:
- C/C++ code
void CMyTree::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CTreeCtrl::OnPaint() CRect rcClient; GetClientRect(&rcClient); const COLORREF crTreeBack = RGB(255, 255, 255);//GetBkColor(); const COLORREF crTreeText = RGB(0, 0, 0);//GetTextColor(); dc.FillSolidRect(rcClient, crTreeBack); //执行默认绘制动作 DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0); HTREEITEM ht = GetFirstVisibleItem(); int nVisibleCount = GetVisibleCount(); const DWORD TVIS_FOCUSED = 0x0001; dc.FillSolidRect(rc, crBack); dc.SetBkMode(TRANSPARENT); CFont *pOldFont = dc.SelectObject(GetFont()); while(ht && nVisibleCount--) { UINT uState = GetItemState(ht, TVIS_SELECTED | TVIS_FOCUSED); COLORREF crBack = (uState & TVIS_SELECTED)? RGB(49,106,197) : crTreeBack; COLORREF crText = (uState & TVIS_SELECTED)? RGB(255,255,255) : crTreeText; CRect rc; GetItemRect(ht, &rc, TRUE); CString sText = GetItemText(ht); if(sText == _T("360Rec")) { dc.SetTextColor(RGB(255,0,0)); dc.DrawText(_T("360"), &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX); dc.SetTextColor(RGB(0,0,0)); CRect rcRange; dc.DrawText(_T("360"), &rcRange, DT_SINGLELINE|DT_CALCRECT); CRect newRc = rc; newRc.left += rcRange.Width(); dc.DrawText(_T("Rec"), &newRc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX); } else { dc.SetTextColor(crText); dc.DrawText(sText, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_NOPREFIX); } if(uState & TVIS_SELECTED) { dc.DrawFocusRect(rc); } ht = GetNextVisibleItem(ht); } dc.SelectObject(pOldFont); }