现在我自己自绘了一个树形控件T1,加了ITEM:树形结构如下:I1
I1_1
I1_1_1
I1_1_2
I1_2
I1_2_1
I1_3
I2
I2_1
I2_1_1
I2_2
要实现这样的效果,1,双击I1,I2不会收缩,双击I1_1,I1_2,I2_1是可以收缩的
2.初始化后就是全部展开的效果,就是上面这种图
3.I1,I2选中后无论单击还是双击都不会自绘,怎么在DrawItem中判断
在线等高手指点,尤其是第一点问题,一直想不到怎么解决?
I1_1
I1_1_1
I1_1_2
I1_2
I1_2_1
I1_3
I2
I2_1
I2_1_1
I2_2
要实现这样的效果,1,双击I1,I2不会收缩,双击I1_1,I1_2,I2_1是可以收缩的
2.初始化后就是全部展开的效果,就是上面这种图
3.I1,I2选中后无论单击还是双击都不会自绘,怎么在DrawItem中判断
在线等高手指点,尤其是第一点问题,一直想不到怎么解决?
解决方案 »
- MFC在文档中打开一张图片,并做了处理之后,这张图片如何保存到电脑上
- 请问window下如何向一个进程发送SIGTERM信号?谢谢
- 怎样获取占用一个互斥量的进程的句柄?
- 1、设置VC编译链接选项 2、NC访问FTP服务器
- CString 里面补齐字符的问题
- 编了个FTP的服务端,可是用资源管理器浏览中文文件是乱码,而用FTP客户端则正常,请问怎么解决?谢谢
- 请问:如何在两个对话框之间进行数据传送?如何定义两个对话框都能使用的全局变量???
- 请问以下这个编译错误是什么意思:error C2664?
- 用户数据一般保存在注册表什么位置?
- 用VC做底层开发和驱动,需要掌握哪方面的技术
- 如何在主框架窗口有需要时同时弹出两个对话框?
- 用VC++6.0编写网上书店程序
使用HitTest通过鼠标位置获取当前的节点ITEM
然后根据ITEM判断是否Expand(展开或或收缩)子节点代码自己搞定
用Expand收拢双击项的父亲项的兄弟们如果双击项的父亲项是根
不予理睬
{
HTREEITEM cur=mTree.GetSelectedItem(); //取得当前选中的项目
HTREEITEM Father=mTree.GetParentItem(cur); //取得当前选中的项目的父亲项
HTREEITEM x=Father; //当前选中的项目的叔伯们
if(TVI_ROOT==Father) return; //如果父亲项就是祖宗就当啥也没发生过
x=Father; //从当前选中的项目的父亲项开始
while(1)
{
x=mTree.GetPrevSiblingItem(Father) //向前找
if(NULL==x) break; //找到大伯为止
mTree.Expand(x,0); //收起来
} x=Father; //从当前选中的项目的父亲项开始
while(1)
{
x=mTree.GetNextSiblingItem(fater); //向后找
if(NULL==x) break; //找到么叔为止
mTree.Expand(x,0); //收起来
} *pResult = 0;
}
HTREEITEM cur=mTree.GetSelectedItem();
HTREEITEM Father=mTree.GetParentItem(cur);
if(NULL==Father) return;
*pResult = 0;
发现双击还是可以把I2收缩起来,单步测试的确到了 if(NULL==Father) return;
求原因
{
AfxMessageBox(GetItemText(hItem));
if(ItemHasChildren(hItem))
{
HTREEITEM hChildItem = GetChildItem(hItem);
while(hChildItem!=NULL)
{
TreeVisit(hChildItem); //递归遍历孩子节点
hChildItem = GetNextItem(hChildItem, TVGN_NEXT);
}
}
} 树的遍历
void ExpandTreeNode(CTreeCtrl& treeCtrl, HTREEITEM hItem)
{
if(NULL == hItem)
{
return ;
} treeCtrl.Expand(hItem, TVE_EXPAND);
HTREEITEM hChildItem = treeCtrl.GetChildItem(hItem);
ExpandTreeNode(treeCtrl, hChildItem); HTREEITEM hNextItem = treeCtrl.GetNextItem(hItem, TVGN_NEXT);
ExpandTreeNode(treeCtrl, hNextItem);
}// 初始化参数中 HTREEITEM hItem = m_tree.InsertItem(_T("I1"));
HTREEITEM hItem2 = m_tree.InsertItem(_T("I1_1"), hItem);
m_tree.InsertItem(_T("I1_1_1"), hItem2);
m_tree.InsertItem(_T("I1_1_2"), hItem2);
m_tree.InsertItem(_T("I1_1_3"), hItem2); hItem2 = m_tree.InsertItem(_T("I1_2"), hItem);
m_tree.InsertItem(_T("I1_2_1"), hItem2);
m_tree.InsertItem(_T("I1_3"), hItem);
hItem2 = m_tree.InsertItem(_T("I2"));
HTREEITEM hItem3 = m_tree.InsertItem(_T("I2_1"), hItem2);
m_tree.InsertItem(_T("I2_1_1"), hItem3);
m_tree.InsertItem(_T("I2_2"), hItem2); ExpandTreeNode(m_tree, m_tree.GetRootItem());// NM_CLICK消息,NM_DBLCLK与此类似void CXXDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) //NM_CLICK消息响应函数
{
// TODO: Add your control notification handler code here CPoint pt;
GetCursorPos(&pt);
m_tree.ScreenToClient(&pt);
HTREEITEM hItem = m_tree.HitTest(pt);
if(hItem)
{
if(NULL == m_tree.GetParentItem(hItem))
{
m_tree.Expand(hItem, TVE_EXPAND);
*pResult = 1;
return ;
}
}
*pResult = 0;
}