树视图控件简单应用
首先往对话框添加一个树视图控件,设置样式为有线条,有按钮,根部的线,并为其关联变量m_TreeCtrl,接着往对话框添加一个变量CImageList m_ImageList; 然后往工程引入两个图标,用于显示树视图项前的图标。
在对话框初始化函数里添加以下代码:
m_ImageList.Create(24,24,ILC_COLOR24|ILC_MASK,1,1);
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1)));
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON2)));
m_TreeCtrl.SetImageList(&m_ImageList,TVSIL_NORMAL);
HTREEITEM hFriends=m_TreeCtrl.InsertItem("朋友",0,0);//根结点
m_TreeCtrl.InsertItem("家人",0,0);
m_TreeCtrl.InsertItem("小明",1,1,hFriends);
m_TreeCtrl.InsertItem("小华",1,1,hFriends);
运行效果:
关于上面InsertItem函数参数解释,第一个参数是项文本内容,第二个参数是项正常显示时的图标,第三个参数是项被选中时显示的图标,
索引相对于设置的m_ImageList,第四个参数指明是在哪个项下,没指明的话,默认为TVI_ROOT(根结点)
获取选中项文本内容,可用GetSelectedItem获取选中项句柄,再用GetItemText函数根据项句柄获取项文本内容。如:
HTREEITEM hSelItem=m_TreeCtrl.GetSelectedItem();
CString itemText=m_TreeCtrl.GetItemText(hSelItem);
树视图复选框应用
可以在树视图控件属性窗口把树控件的样式设置具有复选功能,在更多样式里,勾上“复选框",这里要说明的是如何获取被复选的项文本内容,得用下面这几个函数:
GetRootItem该函数获取根结点,返回第一结点
GetChildItem该函数根据句柄,获取其下第一子结点句柄,无返回NULL
GetNextSiblingItem该函数根据句柄,获得同级下一个结点句柄,无则返回NULL.
GetCheck根据句柄判断结点是否被选中,选中返回BST_CHEKCED.(控件得有复选框属性)
首先得定义一个函数,这个函数遍历所有结点,每获取得一个结点,就用GetCheck函数判断是否被核记,核记了,就获取文本。
遍历所有结点的函数代码如下:
void CEighthDlg::GetItemText(HTREEITEM hItem,CString &strChecks)
{
if(m_TreeCtrl.GetCheck(hItem)==BST_CHECKED)
{CString itemText=m_TreeCtrl.GetItemText(hItem);
strChecks+=itemText;
strChecks+='\n';
}
HTREEITEM hChildItem=m_TreeCtrl.GetChildItem(hItem);//获得子结点句柄
if(hChildItem!=NULL)
GetItemText(hChildItem,strChecks);
HTREEITEM NextSiblingItem=m_TreeCtrl.GetNextSiblingItem(hItem);//获得同级下一个子结点句柄
if(NextSiblingItem!=NULL)
GetItemText(NextSiblingItem,strChecks);
}
调用方法,如一个按钮单击消息处理函数:
void CEighthDlg::OnOK()
{
// TODO: Add extra validation here
CString strChecks;
GetItemText(m_TreeCtrl.GetRootItem(),strChecks);//GetRootItem获得根结点
MessageBox(strChecks);
//CDialog::OnOK();
}
设置树视图字体大小
这里就不设置大小了,用图标可以把项大小撑起来,如CImageList类创建图像列时候,把大小改一下就可以达到修改树视图项高度的效果。
从CTreeCtrl派生出子类CNewTreeCtrl,手动添加NM_CUSTOMDRAW消息映射:
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDraw )
给CNewTreeCtrl添加NM_CUSTOMDRAW消息处理函数OnCustomDraw:
void CNewTreeCtrl::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult)
{
NMTVCUSTOMDRAW *pListCtrl=(NMTVCUSTOMDRAW *)pNMHDR;
if ( CDDS_PREPAINT == pListCtrl->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pListCtrl->nmcd.dwDrawStage )
{
pListCtrl->clrText=RGB(255,0,0);//字体颜色
CDC dc;
dc.Attach(pListCtrl->nmcd.hdc);
CFont Font;
Font.CreatePointFont(125,"宋体");//创建字体
dc.SelectObject(&Font);
dc.Detach();
*pResult =CDRF_DODEFAULT;
}
}
树视图关联变量,设置控件样式,引入图标,跟第一个例子一样。这里就不再说明了。
对话框初始函数添加代码如下:
m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON1)));
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON2)));
m_TreeCtrl.SetImageList(&m_ImageList,TVSIL_NORMAL);
HTREEITEM hFriends=m_TreeCtrl.InsertItem("朋友 ",0,0);//根结点
m_TreeCtrl.InsertItem("家人 ",0,0);//加空格是为了增加文本项的宽度
m_TreeCtrl.InsertItem("小明 ",1,1,hFriends);
m_TreeCtrl.InsertItem("小华 ",1,1,hFriends);
运行效果:
关于NM_CUSTOMDRAW消息解释请参考:如流,新一代智能工作平台