昨天写了篇关于ClistCtrl基本使用的东西,后来在学习使用CTreeCtrl时发现了前面文章的几点问题,诚惶诚恐,于是接着写这篇关于CtreeCtrl的学习心得,纠正一些观点,也算是前篇的姊妹篇吧(至于ClistView和CtreeView,以后碰到再写
O(∩_∩)O~)
还是先看一点点代码:(CUseTreeDlg::OnInitDialog()中)
// TODO: Add extra initialization here
m_pTreeCtrl=new CmyTreeCtrl(); //还是派生一个类哦
m_pTreeCtrl->Create(WS_VISIBLE|WS_TABSTOP|WS_CHILD|WS_BORDER|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_HASLINES|TVS_DISABLEDRAGDROP,CRect(10, 10, 200, 300),this,0 ); //创建一个树形控件,不要在RESOURCE中创建。
// DWORD dwStyle = GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);
// dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
// SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyle);
HTREEITEM hRoot=m_pTreeCtrl->InsertItem("总部");
//创建完了就可以插入了,默认
//情况下是插入根节点,这里用hRoot保存返回的句柄,以便后面访问
HTREEITEM hParent[5]; //定义5个句柄
for(int i(0);i<5;++i)
{
hParent[i]=m_pTreeCtrl->InsertItem(CString("文件夹")+CString(i+49),hRoot);
//也是插入操作,注意那两个Cstring相加,结果很好吧(嘿嘿,其中缘由很简单哈);
//插入函数的第二个参数就是前面的句柄,表示在根节点下插入;最后返回一个自己的树节点句
//柄,以备后用,如下:
m_pTreeCtrl->InsertItem("文件1",hParent[i]);
}
m_pTreeCtrl->Expand(hRoot,TVE_EXPAND);
//最后展开在树根节点展开,你可以用hParent代替hRoot,看下什么情况
return TRUE; // return TRUE unless you set the focus to a control
树形控件的疑点除了创建,其次就是如何插入,也就是如何建立各个节点间的关系,如果节点比较死(不怎么变化),用几个循环就可以了建立起来了,但是如果是像我们的资源管理器中的那个树形(文件经常变换),就需要使用递归了,具体算法不好说哦,有兴趣的同学可以看下VC知识库中的源代码VC控件 TreeCtrl 与 ListCtrl 演示,这个演示确实不错!。
好了,现在来说下昨天的问题,当时我自认为使用在资源中直接拖加的控件不好使,是因为我不知道怎么设置控件样式。我只知道Create函数可以设置STYLE,却不知
// DWORD dwStyle = GetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE);
// dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
// SetWindowLong(m_TreeCtrl.m_hWnd,GWL_STYLE,dwStyle);
的含义,几次谋面,深有印象,却厌其麻烦嫌其丑陋。今天再看上述演示源代码时,才深深切切的感受到这2个函数的是非常有用的。
第一个参数都是窗体句柄,第二个参数是要获得和改变的具体内容,注意GetWindowLong返回一个信息,SetWindowLong依赖传入第三个参数设置信息。
上面的使用是改变树形的样式(GWL_STYLE),有了这2个函数,就可以先在资源对话框中拖控件,然后再设置其样式了,这样,就不需要派生一个类。该2个函数还有一些其他不错的应用,可以参看网上的资料,这里就不谈了。