【List Control】基本用法
一、属性
如图所示就是树形控件了,这个没什么好说的。
下来是一些常用的属性:
1.想要编辑树节点的文本内容,需要Edit Labels。
2.显示的风格,扩展线之类的,Has Lins等。
3.数据太多需要滚动,找Scroll。
二、控件变量&初始化:
DDX_Control(pDX,IDC_TEXT_GROUP_TREE,m_ctr_tree);
CTreeCtrl m_ctr_tree;
1.初始化(这里写在page,只看用法就行无所谓的)
BOOL CXXXPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
HTREEITEM hRoot; //根节点
HTREEITEM hCataItem; //分类节点
for(int i = 0 ; i < 3; i++)
{
CString _str_root;//根节点名称
_str_root.Format(_T("我是根节点%d"),i);
hRoot = m_ctr_tree.InsertItem(_str_root.GetString()); //以此插入根节点(BTW:这里有CString->std:wstring的转换)
m_ctr_tree.SetItemData(hRoot,i); //设置一个整数,可以理解成结点的ID (用来查找什么的)
for (int j = 0; j < 4; j++)
{
CString _text;
_text.Format(L"小分队%d",j+1);
hCataItem = m_ctr_tree.InsertItem((_text),1,1,hRoot,TVI_LAST); //依次添加子节点,到对应的根节点上
m_ctr_tree.SetItemData(hCataItem,10000+ j+1); //设置一个整数,可以理解成结点的ID (用来查找什么的)
}
}
UpdateData(FALSE);
return TRUE;
}
运行结果如下:
2.一个获取结点ID的函数,返回是否为根节点。
bool CXXXPage::get_cur_id(int& _root_id,int& _son_id)
{
HTREEITEM hItem = m_ctr_tree.GetSelectedItem(); //得到当前选中的结点
int id = m_ctr_tree.GetItemData(hItem); //当前结点的id
if (id < 10000 && id >= 0 ) //根据竖直判断是根节点还是子节点
{
_root_id = id;
return true;
}
else
{
HTREEITEM patrnt = m_ctr_tree.GetParentItem(hItem); //如果当前id>10000,那么就是刚才添加的子节点。可以获取根节点
_root_id = m_ctr_tree.GetItemData(patrnt); //得到它的根节点ID
_son_id = id;
return false;
}
return true;
}
三、消息响应
选择不同行的响应消息:
void CXXXPage::OnTvnSelchangedLineGroupTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
*pResult = 0;
int _root_id = -1; //结点的id
int _son_id = -1;
bool _is_root = get_cur_id(_root_id,_son_id);
UpdateData(TRUE); //得到控件的值
HTREEITEM hItem = m_ctr_tree.GetSelectedItem(); //当前选择的结点
CString strText;
strText = m_ctr_tree.GetItemText(hItem);//当前选择的结点上的内容
if (_is_root) //如果是根节点,作相应操作……
{
SetDlgItemText(IDC_EDIT_ROOT_NAME, strText); //将根节点的内容显示到Edit控件上
SetDlgItemText(IDC_EDIT_SON_NAME, _T("")); //显示子节点的Edit控件,字符串为空
}
else
{
//当前选择的是子节点,也可以自由发挥……
}
这个消息是用来编辑结点内容的:
void CXXXPage::OnTvnEndlabeleditLineGroupTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
UpdateData(TRUE); //获取当前空间的值
if (TVIF_TEXT & pTVDispInfo->item.mask) //这一句决定了消息是否正确。切换一行有三种状态,这里可以仔细研究下。否则会执行三次!
{
int i = m_ctr_tree.GetItemData(pTVDispInfo->item.hItem); //获取当前的结点id
if (i < 10000 && i >= 0 ) //根节点
{
m_ctr_tree.SetItemText(pTVDispInfo->item.hItem,pTVDispInfo->item.pszText);//将新名字设置到树上
//其它操作……
}
(i >= 10000) ? *pResult = 0 : *pResult = 1; //如果是子节点则不允许修改名称 (*pResult 的值决定是否能够修改结点的内容,0是不可以修改)
}
*pResult = 0 ;
}
这些都是简单的用法, 基本的都够用啦!