15,979
社区成员
发帖
与我相关
我的任务
分享
// MyTreeCtrl.cpp : 实现文件
//
#include "stdafx.h"
//#include "CTreeCtrl自绘.h"
#include "MyTreeCtrl.h"
// CMyTreeCtrl
IMPLEMENT_DYNAMIC(CMyTreeCtrl, CTreeCtrl)
CMyTreeCtrl::CMyTreeCtrl()
{
m_pBmpList = NULL;
m_pIconList = NULL;
m_RootFont.CreateFont(
13, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_BOLD, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
PROOF_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体")); // lpszFacename
m_ChildFont.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
PROOF_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体")); // lpszFacename
}
CMyTreeCtrl::~CMyTreeCtrl()//释放申请的内存
{
m_iter = m_mapItemData.begin();
while (m_iter != m_mapItemData.end())
{
if (m_iter->second != NULL)
{
delete m_iter->second;
m_iter->second = NULL;
}
++m_iter;
}
}
BEGIN_MESSAGE_MAP(CMyTreeCtrl, CTreeCtrl)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
// CMyTreeCtrl 消息处理程序
CImageList* CMyTreeCtrl::GetBmpList(CImageList* pBmpList)
{
CImageList* pOldBmpList = m_pBmpList;
m_pBmpList = pBmpList;
return pOldBmpList;
}
CImageList* CMyTreeCtrl::GetIconList(CImageList* pIconList)
{
CImageList* pOldIconList = m_pIconList;
m_pIconList = pIconList;
return pOldIconList;
}
void CMyTreeCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
GetClientRect(&m_ClientRect);
//创建兼容的内存DC和位图,并将位图选入到内存DC
CBitmap bitmap;
CDC MemeDc;
MemeDc.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc, m_ClientRect.Width(), m_ClientRect.Height());
CBitmap* pOldBmp = MemeDc.SelectObject(&bitmap);
DrawBackGround(&MemeDc);//向兼容的内存DC中绘制背景
DrawItem(&MemeDc); //将每一项逐个绘制到树控件上
dc.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), &MemeDc, 0, 0, SRCCOPY);
MemeDc.SelectObject(pOldBmp);
MemeDc.DeleteDC();
}
void CMyTreeCtrl::DrawBackGround(CDC* pDC)
{
pDC->FillSolidRect(m_ClientRect, RGB(143, 175, 156));
}
void CMyTreeCtrl::DrawItem(CDC* pDC)
{
HTREEITEM hCurrentItem, hParentItem;//绘制的当前项句柄和其父句柄
DWORD dTreeStyle;//树控件的类型
CRect CurItemRect;//当前项的区域
int CurItemState;//当前项的状态
dTreeStyle = ::GetWindowLong(m_hWnd, GWL_STYLE);//获取树的类型style
hCurrentItem = GetFirstVisibleItem();//获取第一个可见的项,返回它的句柄值
do
{ //Nonzero if the item is visible, with the bounding rectangle contained in lpRect.
//Otherwise, 0 with lpRect uninitialized.
if (GetItemRect(hCurrentItem, CurItemRect, 1))
{
CurItemRect.left = CurItemRect.left - 20;
CRect fillRect(0, CurItemRect.top, m_ClientRect.right, CurItemRect.bottom);
//Returns the state of the item specified by hItem.
CurItemState = GetItemState(hCurrentItem, TVIF_STATE);
//当前正绘制的项已超出窗口的边界,所以不绘制,并退出绘制
if (CurItemRect.top > m_ClientRect.bottom)
{
break;
}
//当前节点没有孩子节点,才为其绘制鼠标热点
if (hCurrentItem == m_CurMouseItem && ItemHasChildren(hCurrentItem) == NULL)
{
pDC->FillSolidRect(&fillRect, GetSysColor(COLOR_HIGHLIGHTTEXT));
}
if (CurItemState & TVIS_SELECTED)//当前项的状态有被选中这个状态
{
pDC->FillSolidRect(&fillRect, GetSysColor(COLOR_HIGHLIGHT));
fillRect.DeflateRect(-1, -1);
pDC->DrawFocusRect(&fillRect);
}
//绘制展开图标
//if (ItemHasChildren(hCurrentItem))
//{
// CPoint point;
// point.x = CurItemRect.left;//x值最左
// point.y = CurItemRect.top + (CurItemRect.Height() - 16) / 2;//y值居中
// if (CurItemState & TVIS_EXPANDED)//当前项展开
// m_pIconList->Draw(pDC, 3, point, ILD_TRANSPARENT);
// else//当前项没展开
// m_pIconList->Draw(pDC, 2, point, ILD_TRANSPARENT);
//}
//绘制文字前面的图标
CurItemRect.left += 16 + 2;
//返回值是map的迭代器
m_iter = m_mapItemData.find(hCurrentItem);
int nIconIndex = m_iter->second->nIconIndex;
//m_pIconList->Draw(pDC, nIconIndex, CurItemRect.TopLeft(), ILD_NORMAL);
//绘制文字
CurItemRect.left += 16 + 2;
CurItemRect.right = m_ClientRect.right;
DrawItemText(pDC, hCurrentItem, CurItemRect);
}
} while ((hCurrentItem = GetNextVisibleItem(hCurrentItem)) != NULL);
}
HTREEITEM CMyTreeCtrl::InsertItemEx(CString strText, int nIconIndex, HTREEITEM lparent, HTREEITEM lpFont)
{
HTREEITEM hTempTreeItem;
hTempTreeItem = InsertItem(strText, lparent, lpFont);
ITEM_DATA* pItemData = new ITEM_DATA;
pItemData->strText = strText;
pItemData->nIconIndex = nIconIndex;
//m_mapItemData.insert(make_pair(hTempTreeItem,pItemData));
m_mapItemData.insert(pair<HTREEITEM, ITEM_DATA*>(hTempTreeItem, pItemData));
return hTempTreeItem;
}
void CMyTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
m_mouseOldPoint = point;
HTREEITEM hItem = HitTest(point);//判断鼠标在控件的哪一项上面
if (hItem != NULL && m_CurMouseItem != hItem)
{
m_CurMouseItem = hItem;
Invalidate(FALSE);
}
CTreeCtrl::OnMouseMove(nFlags, point);
}
void CMyTreeCtrl::DrawItemText(CDC * pDC, HTREEITEM pItem, CRect Rect)
{
CString ItemText = GetItemText(pItem);
CSize fontSize;
fontSize = pDC->GetTextExtent(ItemText);//返回字体的尺寸
//让文字显示在矩形垂直的中间位置
int middPos;
middPos = (Rect.Height() - fontSize.cy) / 2;
Rect.top += middPos;
//Rect.bottom += 50;
pDC->SetBkMode(TRANSPARENT);
if (GetParentItem(pItem) == NULL)//如果是最顶级节点
{
pDC->SelectObject(&m_RootFont);
pDC->SetTextColor(0x000000);
pDC->DrawText(ItemText, Rect, DT_LEFT | DT_TOP);//显示项文本
}
else
{
if (ItemHasChildren(pItem))//有孩子节点
{
pDC->SelectObject(&m_RootFont);
}
else//没孩子节点
{
pDC->SelectObject(&m_ChildFont);
}
//pDC->SetTextColor(0x000066);
pDC->SetTextColor(RGB(255,0,0));
CListCtrl list;
list.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_REPORT | LVS_EDITLABELS,
Rect, this, 0);
list.InsertColumn(0, _T("hello"));
list.InsertColumn(1, _T("hello"));
list.InsertColumn(2, _T("hello"));
}
//pDC->DrawText(ItemText, Rect, DT_LEFT | DT_TOP);//显示项文本
}
void CMyTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CTreeCtrl::OnLButtonDown(nFlags, point);
}