最近项目要用到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;
}
仿照这位兄弟的代码自绘了一个,
@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;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货