一、自绘接口
WTL提供的CCustomDraw,通过让控件继承CCustomDraw,可以实现控件的自绘。
二、自绘步骤
1. 派生新的控件类,同时继承CCustomDraw,比如:
class COwerTree :
public CWindowImpl<COwerTree, CTreeViewCtrl>,
public CCustomDraw<COwerTree>
2. 添加Message Map
BEGIN_MSG_MAP(COwerTree)
REFLECTED_NOTIFY_CODE_HANDLER_EX(TVN_ITEMEXPANDING, OnItemExpanding)
CHAIN_MSG_MAP_ALT(CCustomDraw<COwerTree>, 1)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
CHAIN_MSG_MAP_ALT(CCustomDraw<COwerTree>, 1)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
3. 添加相应函数
// 自绘
LRESULT COwerTree::OnItemExpanding ( NMHDR* phdr )
{
return FALSE;
}
DWORD COwerTree::OnPrePaint( int idCtrl, LPNMCUSTOMDRAW lpNMCD)
{
return CDRF_NOTIFYITEMDRAW;
}
DWORD COwerTree::OnItemPrePaint( int idCtrl, LPNMCUSTOMDRAW lpNMCD)
{
NMTVCUSTOMDRAW* pnmtv = (NMTVCUSTOMDRAW*) lpNMCD;
RECT rcItem = lpNMCD->rc ; // Item的区域
HDC hdcItem = lpNMCD->hdc ; // Item的dc
POINT ptItem ;
ptItem.x = rcItem.left + 1 ;
ptItem.y = rcItem.top + 1 ;
UINT uFlags;
HTREEITEM hItem = HitTest(ptItem, &uFlags); // Item 句柄
if(!hItem) return CDRF_DODEFAULT;
LRESULT COwerTree::OnItemExpanding ( NMHDR* phdr )
{
return FALSE;
}
DWORD COwerTree::OnPrePaint( int idCtrl, LPNMCUSTOMDRAW lpNMCD)
{
return CDRF_NOTIFYITEMDRAW;
}
DWORD COwerTree::OnItemPrePaint( int idCtrl, LPNMCUSTOMDRAW lpNMCD)
{
NMTVCUSTOMDRAW* pnmtv = (NMTVCUSTOMDRAW*) lpNMCD;
RECT rcItem = lpNMCD->rc ; // Item的区域
HDC hdcItem = lpNMCD->hdc ; // Item的dc
POINT ptItem ;
ptItem.x = rcItem.left + 1 ;
ptItem.y = rcItem.top + 1 ;
UINT uFlags;
HTREEITEM hItem = HitTest(ptItem, &uFlags); // Item 句柄
if(!hItem) return CDRF_DODEFAULT;
// 在这里实现Item的自绘
return CDRF_SKIPDEFAULT; // 忽略系统的默认自绘
}
return CDRF_SKIPDEFAULT; // 忽略系统的默认自绘
}
三、附件实现了简单的树控件的自绘
转载于:https://blog.51cto.com/pyhcx/192514