最近项目要用到CTreeCtrl,
仿照这位兄弟的代码自绘了一个,
@hurryboylqs
http://blog.csdn.net/hurryboylqs/article/details/5548605
然而,现在希望能改变CTreeCtrl子项的尺寸,但是单单在绘制时将子项绘制得大一些肯定没用,因为对鼠标消息有响应的区域还是原来的大小,这样会造成空间的实际大小和画面大小错误。各位大侠来帮帮我吧!
void CSkinTreeCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);

LPNMTVCUSTOMDRAW lpnmcd = (LPNMTVCUSTOMDRAW) pNMCD;
if (lpnmcd ->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}
else if (lpnmcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
CRect rcItem(pNMCD->rc);          // Item的区域
POINT ptItem ;           我说的改变尺寸,就是想改变rcItem结构体所表示的矩形的尺寸
ptItem.x = rcItem.left + 1 ; 
ptItem.y = rcItem.top + 1 ; 
UINT uFlags; 
HTREEITEM hItem = HitTest(ptItem, &uFlags);  // Item 句柄
if(!hItem) 
{
*pResult = CDRF_DODEFAULT;
return;
}
CRect rcClient;
GetClientRect(&rcClient);
rcItem.left=0;
rcItem.right=rcClient.right;
rcItem.NormalizeRect();
HDC  hdcItem = pNMCD->hdc ;  //  Item的dc
CDC dc;
dc.Attach(hdcItem);
int nSave = dc.SaveDC();
dc.FillSolidRect(&rcItem,RGB(234, 237, 242));
//draw something
CString strText;
strText=GetItemText(hItem);
if (GetItemState(hItem, TVIS_SELECTED) == TVIS_SELECTED)
{
CImage img;
if (GetFocus() == this)
{
img.LoadFromResource(AfxGetResourceHandle(), IDB_TREE_SELECT_BKG);
}
else
{
img.LoadFromResource(AfxGetResourceHandle(), IDB_TREESELECT_NOFOCUS_BKG);
}
img.Draw(dc,rcItem);
img.Destroy();
}
rcItem.left += 30;
dc.SetTextColor(RGB(0,0,0));
dc.SetBkMode(TRANSPARENT);
CFont font;
font.CreateFont(12,   // nHeight
0,                         // nWidth
0,                         // nEscapement
0,                         // nOrientation
FW_NORMAL,                   // nWeight
FALSE,                     // bItalic
FALSE,                     // bUnderline
0,                         // cStrikeOut
ANSI_CHARSET,              // nCharSet
OUT_DEFAULT_PRECIS,        // nOutPrecision
CLIP_DEFAULT_PRECIS,       // nClipPrecision
DEFAULT_QUALITY,           // nQuality
DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
TEXT("宋体"));
dc.SelectObject(&font);
dc.DrawText(strText, strText.GetLength(), &rcItem, DT_LEFT | DT_SINGLELINE | DT_VCENTER);
rcItem.left -= 30;
dc.RestoreDC(nSave);
dc.Detach();
*pResult = CDRF_SKIPDEFAULT;
return;
}
   
*pResult = CDRF_DODEFAULT;
return;
}
BOOL CSkinTreeCtrl::OnEraseBkgnd(CDC* pDC)
{
CRect rcClient;
GetClientRect(&rcClient);
pDC->FillSolidRect(&rcClient,RGB(234, 237, 242));
   return TRUE;
}