朝陽網(wǎng)絡(luò) 網(wǎng)站建設(shè)痘痘如何去除效果好
問題
功能調(diào)整需要依據(jù)不同狀態(tài)設(shè)置樹控件中單個(gè)節(jié)點(diǎn)的文字顏色。
分析
1、CTreeCtrl本身有設(shè)置文字顏色的接口SetTextColor,但是這個(gè)接口是設(shè)置樹控件整體的文字顏色。
2、在自定義接口可以對(duì)樹控件單個(gè)節(jié)點(diǎn)進(jìn)行更新文字顏色和背景顏色,接收自定義繪制消息NM_CUSTOMDRAW。
解決
1、頭文件中定義自定義繪制接口
// .h 文件
//...
// 定義自定義繪制接口
afx_msg void OnNMCustomdrawTree(NMHDR *pNMHDR, LRESULT *pResult);//...
// 定義樹控件變量
CTreeCtrl m_treeList;
2、cpp文件中接收消息并實(shí)現(xiàn)接口
// .cpp 文件// 接收消息
BEGIN_MESSAGE_MAP(ModelTreeDlg, CDialogEx)//...ON_NOTIFY(NM_CUSTOMDRAW, IDC_TREE_MODEL, &OnNMCustomdrawTreeModel)
END_MESSAGE_MAP()// 實(shí)現(xiàn)接口
void OnNMCustomdrawTreeModel(NMHDR* pNMHDR, LRESULT* pResult)
{NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);if (NULL == pLVCD)return;*pResult = CDRF_DODEFAULT;*pResult |= CDRF_NOTIFYITEMDRAW;*pResult |= CDRF_NOTIFYSUBITEMDRAW;*pResult |= CDRF_NOTIFYPOSTPAINT;const DWORD dwDrawStage = pLVCD->nmcd.dwDrawStage;if (dwDrawStage != CDDS_ITEMPOSTPAINT || tree.m_bScolling)return;// 獲取樹控件范圍CRect treeRect;m_treeList.GetClientRect(treeRect);//界面重繪,樹節(jié)點(diǎn)后添加圖標(biāo)HTREEITEM hItem = (HTREEITEM)pLVCD->nmcd.dwItemSpec;CRect textRect;if(tree.GetItemRect(hItem, &textRect, TRUE) == false)return;//獲取節(jié)點(diǎn)的文本文字CString txt = tree.GetItemText(hItem);CDC* pdc = CDC::FromHandle(pLVCD->nmcd.hdc);// 設(shè)置背景顏色pdc->FillSolidRect(&textRect, GetSysColor(COLOR_WINDOW));// 設(shè)置文字顏色,默認(rèn)黑色,依據(jù)實(shí)體狀態(tài)更新COLORREF color = RGB(255, 255, 255);color = GetSysColor(COLOR_WINDOWTEXT);pdc->SetTextColor(color);// 一定要調(diào)用 不然不會(huì)更新顏色顯示pdc->TextOut(textRect.left + 2, textRect.top + 2, txt);
}
3、搞定!效果如下: