1. 树形控件和树形视图:
1) 树形控件在Microsoft Windows95中就已经引入,如文件资源管理器中的树形文件列表就是使用树形控件实现的,这是树形控件最常见的应用;
2) 树形视图就是将整个树形控件作为视图模板的视图,就和之前做过的Phones列表视图一样,直接将CXXXView继承自CTreeCtrl即可;
3) 我们看到的资源管理器的左侧其实就是一个子视图,该视图中只包含树形控件,其本质就是一个树形视图;
!!树形视图在多视图中应用非常多,经常将树形视图作为最左侧的子视图用以展示工作空间中各个资源的从属层级关系;
2. 树形视图的本质:
1) 其实树形视图CTreeView里面就只有两个成员,一个是其构造函数,另一个就是GetTreeCtrl来获取隐藏的(private控制的)的属性控件对象引用;
2) CTreeView其实就只包含了一个CTreeCtrl成员对象,所有的树形操作都是有该成员对象实现的,所有的相关操作都是调用CTreeCtrl的操作实现的,CTreeView仅仅就是对CTreeCtrl的包装而已;
3) 想要操作树形控件就必须先使用GetTreeCtrl获得控件引用,然后再调用控件的函数来实现相关操作:CTreeCtrl& CTreeView::GetTreeCtrl() const;
3. 树形视图的初始化:
1) 树形视图初始化的主要是其外观和功能,而总共有6种样式会影响树形视图的外观和功能;
2) 6种样式:都以TVS_打头,即Tree View Style的缩写
i. TVS_HASLINES:具有线段,将子项目和父项目用线连起来;
ii. TVS_LINESATROOT:将各个根目录用线段连起来(在拿资源管理器来说就是用线段将所有表示盘符的根目录用线连起来),前提是TVS_HASLINES开启时才有效;
iii. TVS_HASBUTTONS:给具有子项目的项目添加带有加减号的按钮,+表示正处于折叠状态,点击后可以展开,-表示正处于展开状态,点击后可以折叠;
iv. TVS_EDITLABELS:开启项目文本编辑通知,有些应用(特别是Windows资源管理器)直接允许在树形空间中修改文件名,可以是双击图标将文件名设置成可编辑状态,编辑完成之后再双击图标或者点击其它任意位置就可以保存并结束编辑,随即文件名修改成功;
!!开始编辑时会发出TVN_BEGINLABELEDIT通知,结束时会发出TVN_ENDLABELEDIT通知;
!!而TVS_EDITLABELS样式决定这两种通知是否可以发送,如果添加则表示可以发送这两种通知,如果不添加则关闭这两种通知的发送功能;
v. TVS_DISABLEDRAGDROP:关闭拖放效果,默认情况下拖放效果是一直打开着的,有时可以将一些东西用鼠标拖放到树形控件的项目中去,比如在Windows资源管理器中,可以将某个文件的图标拖放到树形控件的某个文件夹上,就可以达到将文件移动到该文件夹的目的;
vi. TVS_SHOWSELALWAYS:让加亮显示的选中项目始终被加亮显示(树形控件默认当前选中的项目被加亮显示),默认状态下,当树形控件失去输入焦点时加亮显示会被取消;
3) 在哪里初始化呢?在CTreeView的PreCreateWindow的CREATESTRUCT的style字段中使用位或添加,例如:
BOOL CMyTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CTreeView::PreCreateWindow (cs))
return FALSE;
cs.style |= TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS |
TVS_SHOWSELALWAYS;
return TRUE;
}
3. 树形控件和图形列表控件简介:
1) 树形控件是MFC的公用控件的一种(即高级控件),其它公用控件还有微调杆、进度条、IP地址栏等;
2) 树形控件最大的特点就是用文本字符串和图形来表示每个项目,文本字符串非常好设定,可以直接在InsertItem中传给字符串参数后者直接使用SetItemText等函数设置,但是图形的设置就比较麻烦了;
3) 图形的设置:由于树形控件中的项目通常很多,项目的类型通常也很多,因此也需要很多不同的图形来表示不同的项目,如果这些众多的项目图形分别用单个的位图资源来表示则工程中的位图资源会很多很乱,而且不好管理,而树形控件的项目图形通常面积非常的小,没必要为每个图形创建一个位图资源;
!!CTreeCtrl使用图形列表控件CImageList来管理项目图标;
4) 图形列表控件:
i. 是Windows95中引入的高级图形控件,也成为可选图形列表控件;
ii. 该控件中只加载一个位图