TreeCtrl的子节点能添加上ListCtrl控件吗

zx_0815 2019-10-23 05:20:29
领导突然让我自绘一个这样的一个玩意儿,我通过网上找的例子写了个Treectrl的派生类,然后在派生类的onpaint函数中自绘,到子节点的时候直接在子节点的rect范围内动态创建了一个report类型的listctrl,并插入了两个列表头,但是出来的效果是不断的闪,什么都不显示。是就不能将listctrl插入到treectrl中还是我的操作有问题呀
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zx_0815 2019-10-24
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
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")); 只有 head 吗 ,那就使用 CHeaderCtrl !
不是,以后肯定会插入数据的,我就是随便一插入个表头而已,但是正常来说应该是可以显示的吧,主要是你觉得我这段代码的思路有没有问题呀,插入的位置从想法上来说可以吗,如果有问题我就直接放弃这种想法了,如果没问题的话我再继续研究下去
schlafenhamster 2019-10-24
  • 打赏
  • 举报
回复
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"));

只有 head 吗 ,那就使用 CHeaderCtrl !
zx_0815 2019-10-24
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
看看你的代码
// 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);
}
schlafenhamster 2019-10-24
  • 打赏
  • 举报
回复
看看你的代码
zx_0815 2019-10-24
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
"子节点的rect范围内" 够 大 吗 ?
我也不确定该怎么改。。。大神有没有什么思路呀
schlafenhamster 2019-10-24
  • 打赏
  • 举报
回复
点击 treeitem 时 弹出一个 Clistctrl
schlafenhamster 2019-10-24
  • 打赏
  • 举报
回复
TreeCtrl 行高 容納 不了 ClistCtrl
schlafenhamster 2019-10-23
  • 打赏
  • 举报
回复
"子节点的rect范围内"
够 大 吗 ?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧