树形控件-背景绘制
ue4 treeview树形结构的简单使用方法

一、UE4中的TreeView树形结构概述UE4是一款功能强大的游戏开发工具,拥有丰富的功能和组件,其中就包括了TreeView树形结构。
TreeView是一种常见的用户界面控件,可以用于展示层级关系的数据,比如文件夹结构、菜单树等。
在UE4中,使用TreeView可以实现复杂的层级菜单、属性面板等功能,为游戏开发提供了便利。
二、创建TreeView树形结构1. 在UE4中,首先需要创建一个新的UserWidget,作为TreeView的父容器。
在编辑器中选择“User Interface” -> “Widget Blueprint”,创建一个新的UserWidget,并命名为TreeWidget。
2. 在TreeWidget中添加一个TreeView控件,可以在左侧的“Palette”中找到TreeView,并将其拖拽到TreeWidget的CanvasPanel中。
3. 接下来,我们需要在TreeView中添加树形结构的数据。
在TreeWidget的蓝图中创建一个函数,用于绑定数据到TreeView上。
我们可以创建一个名为BindData的函数,然后在该函数中使用AddChild和AddRoot函数向TreeView中添加节点数据。
4. 通过调用TreeView的SetItemHeight函数,可以设置每个节点的高度,使得TreeView显示更加美观。
还可以通过SetIndentation函数设置节点的缩进距离,以体现层级关系。
三、处理TreeView树形结构的交互1. 在UE4中,TreeView是支持交互操作的,比如鼠标点击、拖拽等。
通过监听TreeView的事件,我们可以实现节点的展开、折叠、选中等操作。
2. 在TreeWidget的蓝图中,可以通过绑定TreeView的事件回调函数来处理交互操作,比如OnItemClicked、OnItemDoubleClicked 等。
在这些回调函数中,可以编写逻辑代码来处理节点的展开、折叠等操作。
vb6.0中树状图使用方法

热身:理解层级概念,层级理论上可以有无限级,一般用到四,五级也够用了。
最上级的只能有一个,我们把它叫做“爷”,接下来是“父”,再是“子”,再是“孙”,接下来是“曾孙”......,汇总如下:“爷,父,子,孙,曾孙”,这里是5级关系,除了“爷”只能有一个外,其余可以有无限个。
记住这些,下面要用。
第一小时:学习直接用代码将数据填充到树控件中。
为什么要先学习直接用代码将数据填充到树控件中?因为这种方法是最简单的,代码也最容易理解,学习树控件,先将这个学会,已经掌握了一半,所以先不要急着想怎么将表中的数据填充到树控件中,在第一小时里,树控件和表完全没有关系。
目的:我们要在树控件中建立如下的一个3层级关系水果||__苹果| |__红富士| |__国光||__葡萄|__红提子|__青提子解释:水果包含2种,一种是苹果,一种是葡萄,苹果又包含2种,一种是红富士,一种是国光,葡萄也如此。
在这里:“爷”是水果,“父”是苹果,葡萄,“子”是红富士,国光,红提子,青提子。
概括如下:爷(只能有一个):水果父(这里有2个):父1:苹果;父2:葡萄子(这里有4个):子1:红富士(父1苹果的子);子2:国光(父1苹果的子);子3:红提子(父2葡萄的子);子4:青提子(父2葡萄的子)1、新建一个窗体,在窗体上放置两个控件,一个是Treeview,一个是Imagelist如何找到这两个控件?Treeview控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Treeview Control,Version 6.0"Imagelist控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Imagelist Control,Version 6.0"Treeview控件大家都明白干什么用的,Imagelist控件是干什么用呢?原来这个控件是放图标用的,如果你想在树控件中显示图标的,这个图标都将储存在ImageList控件中。
pythonGUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例

pythonGUI库图形界⾯开发之PyQt5树形结构控件QTreeWidget详细使⽤⽅法与实例PyQt5树形结构控件QTreeWidget简介QTreeWidget 类根据预设的模型提供树形显⽰控件。
QTreeWidget 使⽤类似于 QListView 类的⽅式提供⼀种典型的基于 item 的树形交互⽅法类,该类基于QT的“模型/视图”结构,提供了默认的模型来⽀撑 item 的显⽰,这些 item 类为 QTreeWidgetItem 类。
如果不需要灵活的“模型/视图”框架,可以使⽤QTreeWidget 来创建有层级关系的树形结构。
当把标准 item 模型结合QTreeView 使⽤时,可以得到更灵活的使⽤⽅法,从⽽把“数据”和“显⽰”分离开。
QTreeWidget类中的常⽤⽅法⽅法描述setColumnWidth(int column,int width)将指定列的宽度设置为给定的值Column:指定的列width:指定的宽度insertTopLevelItems()在视图的顶层索引中引⼊项⽬的列表expandAll()展开所有节点的树形节点invisibleRootItem()返回树形控件中不可见的根选项(Root Item)selectionItems()返回所有选定的⾮隐藏项⽬的列表内QTreeWidgetItem类中常⽤的⽅法⽅法描述addChild()将⼦项追加到⼦列表中setText()设置显⽰的节点⽂本Text()返回显⽰的节点⽂本setCheckState(column.state)设置指定列的选中状态:Qt.Checked:节点选中Qt.Unchecked:节点没有选中setIcon(column,icon)在指定的列中显⽰图标QTreeWidget树形结构控件的实例树形结构是通过QTreeWidget和QTreeWidgetItem类实现的,其中QTreeWidgetItem类实现了节点的添加,其完整代码如下import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import QIcon, QBrush, QColorfrom PyQt5.QtCore import Qtclass TreeWidgetDemo(QMainWindow):def __init__(self, parent=None):super(TreeWidgetDemo, self).__init__(parent)self.setWindowTitle('TreeWidget 例⼦')self.tree=QTreeWidget()#设置列数self.tree.setColumnCount(2)#设置树形控件头部的标题self.tree.setHeaderLabels(['Key','Value'])#设置根节点root=QTreeWidgetItem(self.tree)root.setText(0,'Root')root.setIcon(0,QIcon('./images/root.png'))# todo 优化2 设置根节点的背景颜⾊brush_red=QBrush(Qt.red)root.setBackground(0,brush_red)brush_blue=QBrush(Qt.blue)root.setBackground(1,brush_blue)#设置树形控件的列的宽度self.tree.setColumnWidth(0,150)#设置⼦节点1child1=QTreeWidgetItem()child1.setText(0,'child1')child1.setText(1,'ios')child1.setIcon(0,QIcon('./images/IOS.png'))#todo 优化1 设置节点的状态child1.setCheckState(0,Qt.Checked)root.addChild(child1)#设置⼦节点2child2=QTreeWidgetItem(root)child2.setText(0,'child2')child2.setText(1,'')child2.setIcon(0,QIcon('./images/android.png'))#设置⼦节点3child3=QTreeWidgetItem(child2)child3.setText(0,'child3')child3.setText(1,'android')child3.setIcon(0,QIcon('./images/music.png'))#加载根节点的所有属性与⼦控件self.tree.addTopLevelItem(root)#TODO 优化3 给节点添加响应事件self.tree.clicked.connect(self.onClicked)#节点全部展开self.tree.expandAll()self.setCentralWidget(self.tree)def onClicked(self,qmodeLindex):item=self.tree.currentItem()print('Key=%s,value=%s'%(item.text(0),item.text(1))) if __name__ == '__main__':app = QApplication(sys.argv)tree = TreeWidgetDemo()tree.show()sys.exit(app.exec_())初始运⾏图如下优化⼀:设置节点的状态这⾥添加了child1的选中状态child1.setCheckState(0,Qt.Checked)优化⼆:设置节点的背景颜⾊这⾥设置了根节点的背景颜⾊brush_red=QBrush(Qt.red)root.setBackground(0,brush_red)brush_blue=QBrush(Qt.blue)root.setBackground(1,brush_blue)优化三:给节点添加响应事件点击,会在控制台输出当前地key值与value值self.tree.clicked.connect(self.onClicked)def onClicked(self,qmodeLindex):item=self.tree.currentItem()print('Key=%s,value=%s'%(item.text(0),item.text(1)))系统定制模式实例在上⾯的例⼦中,QTreeWidgetItem类的节点是⼀个个添加上去的,这样有时很不⽅便,特别是窗⼝产⽣⽐较复杂的树形结构时,⼀般都是通过QTreeView类来实现的,⽽不是QTreeWidget类,QTreeView和QTreeWidget类最⼤的区别就是,QTreeView类可以使⽤操作系统提供的定制模式,⽐如⽂件系统盘的树列表import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *if __name__ == '__main__':app=QApplication(sys.argv)#window系统提供的模式model=QDirModel()#创建⼀个QTreeView的控件tree=QTreeView()#为控件添加模式tree.setModel(model)tree.setWindowTitle('QTreeView例⼦')tree.resize(640,480)tree.show()sys.exit(app.exec_())本⽂主要讲解了PyQt5树形结构控件QTreeWidget详细使⽤⽅法与实例,更多关于PyQt5控件使⽤知识请查看下⾯的相关链接。
ext tree节点样式

ext tree节点样式Ext树节点样式Ext树是一种常用的JavaScript树形控件,通常用于展示层级结构数据。
节点样式是指树节点的外观表现,可以通过样式属性来设置。
一、基本样式设置1. 背景色(background-color):可以使用CSS的标准颜色值或十六进制颜色值设置节点的背景色。
例如,可以设置节点背景色为红色:```node.style.backgroundColor = 'red';```2. 文本颜色(color):可以使用CSS的标准颜色值或十六进制颜色值设置节点文本的颜色。
例如,可以设置节点文本颜色为蓝色:```node.style.color = 'blue';```3. 字体样式(font-style):可以设置节点文本的字体样式,常用的有斜体(italic)、加粗(bold)等。
例如,可以设置节点文本为加粗字体:```node.style.fontWeight = 'bold';```4. 边框样式(border):可以设置节点的边框样式,包括边框颜色、边框宽度和边框类型等。
例如,可以设置节点边框为灰色实线:```node.style.border = '1px solid gray';```二、高级样式设置1. 图标样式:可以设置节点前面的图标样式,一般用于表示节点的状态或类型。
可以使用CSS的背景图片属性来设置图标。
例如,可以设置节点前面的图标为加号图标:```node.style.backgroundImage = 'url("add.png")';```2. 复选框样式:可以设置节点前面的复选框样式,用于选择节点的状态。
一般使用CSS的背景图片属性来设置复选框图标。
例如,可以设置节点前面的复选框为勾选状态:```node.style.backgroundImage = 'url("checkbox_checked.png")';```3. 高亮样式:可以设置节点在鼠标悬停时的样式,以提升用户体验。
el-tree 树状设置样式

el-tree 树状设置样式el-tree是一个常用的树状结构的组件,它可以用来展示具有层级关系的数据。
本文将介绍el-tree的使用方法,并通过实例来展示其功能和样式设置。
## 1. el-tree的基本使用方法el-tree是基于Element UI框架开发的树状组件,使用前需先引入Element UI库,并按需引入el-tree组件。
```javascriptimport { Tree } from 'element-ui';```el-tree的基本使用方法如下:```html<template><div><el-tree:data="treeData":props="treeProps":expand-on-click-node="false"show-checkboxdefault-expand-all@check-change="handleCheckChange" ></el-tree></div></template><script>export default {data() {return {treeData: [{id: 1,label: '节点1',children: [{id: 11,label: '节点1-1'},{id: 12,label: '节点1-2'}]},{id: 2,label: '节点2',children: [{id: 21,label: '节点2-1' },{id: 22,label: '节点2-2' }]}],treeProps: {children: 'children', label: 'label'}};},methods: {handleCheckChange(data, checkedNodes) {console.log(data, checkedNodes);}}};</script>```## 2. el-tree的样式设置el-tree提供了多种样式设置选项,可以根据需要进行个性化定制。
sketchup配景树的制作方法

SketchUp是一款非常流行的三维建模软件,它可以用来制作各种精美的三维模型,包括建筑、景观等。
其中,配景树是建模中常用的元素之一,本文将介绍在SketchUp中制作配景树的方法。
一、准备工作在制作配景树之前,首先需要准备好一些工具和素材。
以下是一些常用的素材和工具:1. 树木模型:可以在SketchUp的3D Warehouse或者其他全球信息站上下载一些高质量的树木模型,作为制作配景树的基础。
2. 树木纹理:为了使配景树看起来更逼真,我们需要一些树木的纹理图片,可以在全球信息站搜索并下载。
3. 基础模型:在制作配景树时,可以使用一些基础的几何图形来辅助建模,例如圆柱、球体等。
二、制作树干1. 导入树木模型:首先导入一个树木模型,可以选择一棵树的整体模型,或者只导入树干的模型。
2. 调整大小:根据需要,调整树木模型的大小和比例,使其符合实际场景中的需求。
3. 添加纹理:为树木模型添加树干的纹理,可以使用SketchUp的材质工具来进行贴图,并调整纹理的缩放和旋转,使其更符合实际场景中的树木纹理。
三、制作树叶1. 复制树顶:如果树木模型中已经包含了树叶部分,可以直接复制并粘贴,如果没有,可以使用圆柱、球体等基础模型来制作树叶。
2. 添加树叶纹理:为树叶部分添加树叶的纹理,同样可以使用SketchUp的材质工具来进行贴图,并调整纹理的缩放和旋转,使其更逼真。
四、优化细节1. 调整模型:根据实际需要,调整树木模型的细节部分,包括树干的形状、树叶的布局等。
2. 调整材质:可以对树木模型的材质进行调整,使其更符合实际的树木外观。
五、保存和应用1. 保存模型:完成配景树的制作之后,记得保存模型,并保存为可编辑的格式,以便日后进行修改和应用。
2. 应用到场景中:将制作好的配景树模型导入到实际的场景中,可以通过复制、粘贴等操作来进行布置,使其成为场景中的一部分。
六、总结通过以上步骤,我们可以在SketchUp中制作出精美逼真的配景树模型,用于各种建模场景中。
WPS制做树形图的图文教程详解

WPS制做树形图的图文教程详解
wps是金山软件公司的一种办公软件,对日常办公起到了重要作用,那么大家对它的一些功能又有多少了解呢?例如做树形图。
下面店铺马上就告诉大家WPS做树形图的方法,希望能帮到大家。
WPS做树形图的方法
WPS做树形图的步骤1:打开WPS,新建演示文档。
WPS做树形图的步骤2:点击“插入”,选择“形状”。
WPS做树形图的步骤3:在“形状”中选择“流程图”中的形状。
WPS做树形图的步骤4:点击任一你喜欢的形状,箭头会变成十字形,在ppt上面用鼠标可以拉出你选择的形状。
WPS做树形图的步骤5:画完之后不满意可以选中图形,进行大小、方向、颜色的调整。
WPS做树形图的步骤6:再在左上方的形状框中选择其他合适的图形和线条,完善树形图。
element-uitree树形组件自定义实现可展开选择表格

element-uitree树形组件⾃定义实现可展开选择表格最近做项⽬遇到⼀个需求,表格⾥可以展开,可以选择,⼤概效果如下图:项⽬源码: 这个项⽬⾥会把平时博客写的⼀些功能的代码都放在⾥⾯,有需要可以下载看看,有帮助的话点个star哈使⽤表格的⽅式也可以勉强实现效果,但是在判断选择时,⾃⼰要在处理⼀下数据,感觉不太好,就找了找element的其他组件.发现了tree树形组件,展⽰出来的效果是⾃⼰想要的之后⽤了tree树形组件,使⽤了⾃定义⽅法,实现效果还能满⾜需求,就整理了⼀下,下⾯把代码贴上来template:<div class="invoice-list"><!-- 表头的值,⾃⼰单独写的 --><ul class="invoice-header"><li class="invoice-item">发票号</li><li class="invoice-item">订单号</li><li class="invoice-item">发票⾦额</li><li class="invoice-item">开票⽇期</li><li class="invoice-item">收款⽅式</li><li class="invoice-item">状态</li><li class="invoice-item">发票收款⽇期</li><li class="invoice-item">操作</li></ul><el-tree:props="props":data="tableData"default-expand-allref="treeData"@check-change="handleCheckChange"><!-- 使⽤⾃定义,需要加slot-scope,返回两个值,node是当前节点指定的对象data是当前节点的数据 --><div class="custom-tree-node" slot-scope="{ node, data }"><div class="total_info_box clearfix" v-if="data.span"><span><i>对账单号:</i> {{data.accountNo | isEmptyVal}}</span><span><i>对账⾦额:</i> {{data.totalReconciledAmount | formatUSD}}</span><span><i>对账⽇期:</i> {{data.confirmAccountDate | formatYMD}}</span></div><span v-else class="table_info_node"><span class="table_info_item">{{data.invoiceNo}}</span><span class="table_info_item">{{data.orderNo}}</span><span class="table_info_item">{{data.totalAmountTax}}</span><span class="table_info_item">{{data.billingDate}}</span><span class="table_info_item">{{data.forCollection}}</span><span class="table_info_item">{{data.requestStatus}}</span><span class="table_info_item">{{data.receiptDate}}</span><span class="table_info_item"><el-button @click="toInvoiceDetail(data)">详情</el-button></span> </span></div></el-tree></div>js部分data () {return {props: {label: 'accountNo', // 需要指定的节点渲染对象属性children: 'orderInvoiceAssemblyList' // 指定的⼦级},tableData: [] // tree组件渲染的数据}},// ⽅法集合methods: {// tree组件渲染的数据列表getSupplierPayInvoice () {this.tableData = [{accountId: 13,accountNo: `66`,orderNo: '444',totalReconciledAmount: 1000,confirmAccountDate: 1548482834000,span: true,orderInvoiceAssemblyList: [{invoiceNo: '67448',orderNo: '444',totalAmountTax: 1999,billingDate: 1548482834000,forCollection: 999,requestStatus: '未付款',receiptDate: '2019-1-30',accountInvoiceId: 11}, {orderNo: '55',totalAmountTax: 2999,billingDate: 1548482834000,forCollection: 5555,requestStatus: 1,accountInvoiceId: 12}]}, {accountId: 14,accountNo: '789',orderNo: '444',totalReconciledAmount: 2000,confirmAccountDate: 1548482834000,span: true,orderInvoiceAssemblyList: [{orderNo: '888',totalAmountTax: 3999,billingDate: 1548482834000,forCollection: 999,requestStatus: 2,accountInvoiceId: 13}, {orderNo: '999',totalAmountTax: 4888,billingDate: 1548482834000,forCollection: 5555,requestStatus: 1,accountInvoiceId: 14}, {orderNo: '889',totalAmountTax: 4888,billingDate: 1548482834000,forCollection: 5555,requestStatus: 1,accountInvoiceId: 15}]}]},// tree组件选择改变事件handleCheckChange (val) {// console.log(val)// 使⽤getCheckedNodes可以获取当前被选中的节点数据let selected = this.$refs.treeData.getCheckedNodes()console.log(33, selected)}}sass样式.invoice-list {border: 1px solid #ebeef5;margin-top: 10px;.invoice-header {background-color: #f8f8f9;display: flex;padding-left: 63px;border-bottom: 1px solid #ebeef5;.invoice-item {padding: 10px;flex: 1;border-left: 1px solid #ebeef5;padding-left: 10px;}}.el-tree-node__content {background: #f2f2f2;height: 40px;}.el-tree-node__children {.el-tree-node__content {background: #fff;border-bottom: 1px solid #ebeef5; }}.custom-tree-node {width: 100%;height: 100%;.total_info_box {background: #f2f2f2;line-height: 40px;span{float: left;font-size: 12px;margin: 0 15px;i{display: inline-block;margin-right: 3px;}}}.table_info_node {display: flex;height: 100%;.table_info_item {flex: 1;height: 100%;border-left: 1px solid #ebeef5; padding-left: 10px;line-height: 40px;}}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC中实现带有背景位图的树型控件2007-08-02 15:15 1043人阅读评论(6) 收藏举报当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于Visual C++编程爱好者来说,使用Visual C++MFC提供的树型控件(CTreeCtrl)本身就是一个难点,至于如何使该控件能够带有背景位图,那就更加是一个令人困惑的问题了。
本实例对CTreeCtrl类进行了增强,不仅使它带有背景位图,而且解决了在点击树型控件时背景位图闪动的问题,另外,通过在对话框中使用该控件来显示三级目录,演示了树型控件的基本使用方法。
下图为程序编译后的运行效果图:图一、带背景图的树型控件效果图一、实现方法在实现树型控件的背景位图之前,我们首先介绍一下树型控件的基本使用方法。
树形控件在系统中大量被使用,例如Windows资源管理器就是一个典型的例子。
树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上又允许有一个或多个或没有子结点。
MFC中使用CTreeCtrl类来封装树形控件的各种操作,通过调用BOOLCreate( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些树形控件的专用风格:TVS_HASLINES 在父/子结点之间绘制连线;TVS_LINESATROOT 在根/子结点之间绘制连线;TVS_HASBUTTONS 在每一个结点前添加一个按钮,用于表示当前结点是否已被展开;TVS_EDITLABELS 结点的显示字符可以被编辑;TVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点;TVS_DISABLEDRAGDROP 不允许Drag/Drop;TVS_NOTOOLTIPS 不使用ToolTip显示结点的显示字符。
在树形控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄(其中根Root结点只有一个,既不可以添加也不可以删除),利用HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST )可以添加一个结点,pszItem为显示的字符,hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。
如果你希望在每个结点前添加一个小图标,就必需先调用CTreeCtrl类的成员函数CImageList* SetImageList( CImageList * pImageList, int nImageListType ),指明当前控件所使用的图像列表(ImageList),nImageListType为TVSIL_NORMAL。
在调用完成后控件中使用图片以设置的ImageList中图片为准。
然后调用HTREEITEMInsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST)添加结点,其中参数nImage为结点没被选中时所使用图片序号,nSelectedImage为结点被选中时所使用图片序号。
此外CTreeCtrl还提供了一些函数用于得到/修改控件的状态:·HTREEITEM GetSelectedItem( )将返回当前选中的结点的句柄;·BOOL SelectItem( HTREEITEM hItem )将选中指明结点;·BOOL GetItemImage( HTREEITEM hItem, int& nImage, int& nSelectedImage ) / BOOL SetItemImage( HTREEITEM hItem, int nImage, int nSelectedImage )用于得到/修改某结点所使用图标索引;·CString GetItemText( HTREEITEM hItem ) /BOOL SetItemText( HTREEITEM hItem, LPCTSTR lpszItem )用于得到/修改某一结点的显示字符;·BOOL DeleteItem( HTREEITEM hItem )用于删除某一结点,BOOL DeleteAllItems( )将删除所有结点。
此外如果想遍历树可以使用下面的函数:·HTREEITEM GetRootItem( )得到根结点;·HTREEITEM GetChildItem( HTREEITEM hItem )得到子结点;·HTREEITEM GetPrevSiblingItem/GetNextSiblingItem( HTREEITEM hItem )得到指明结点的上/下一个兄弟结点;·HTREEITEM GetParentItem( HTREEITEM hItem )得到父结点。
树形控件的消息映射使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXTree(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。
对于树形控件可能取值和对应的数据结构为:·TVN_SELCHANGED 在所选中的结点发生改变后发送,所用结构:NMTREEVIEW;·TVN_ITEMEXPANDED 在某结点被展开后发送,所用结构:NMTREEVIEW;·TVN_BEGINLABELEDIT 在开始编辑结点字符时发送,所用结构:NMTVDISPINFO;·TVN_ENDLABELEDIT 在结束编辑结点字符时发送,所用结构:NMTVDISPINFO;·TVN_GETDISPINFO 在需要得到某结点信息时发送,(如得到结点的显示字符)所用结构:NMTVDISPINFO;对于Visual C++ MFC提供的标准树型控件CTreeCtrl来说,并不支持背景位图,所以如果需要实现背景位图就需要先让其在内存CDC对象上对TREEVIEW缺省绘图,然后在选择背景位图,与缺省位图合成,即采用贴图的方式,把标准的TREEVIEW窗口贴在底图上。
这个操作在内存中完成。
同时为了避免闪烁,必须重载OnItemexpanding()和OnItemexpanded()这两个函数。
SetRedraw函数主要保证其不要在子节点弹出时重画,而是在子节点已经扩展后重画。
为此,例程中定义了一个CTreeCtrl类的子类CmyTreeCtrl,并重载了以下几个成员函数:BOOL CMyTreeCtrl::SetBKImage(LPCTSTR LpszResource)void CMyTreeCtrl::OnPaint()void CMyTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)void CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult)BOOL CMyTreeCtrl::OnEraseBkgnd(CDC* pDC)二、编程步骤1、启动Visual C++6.0,生成一个基于对话框的项目Tree,在框架上放置一个树形控制件,其ID标志符为:IDC_TREE1;2、创建CmyTreeCtrl类后,使用CLASSWIZARD为其添加消息映射:ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED,OnItemexpanded)ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)消息响应函数:afx_msg void OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult);3、将树型控件与CmyTreeCtrl类建立关联,在对话框中添加变量CMyTreeCtrlm_CtrlTree;4、制作一个准备作为树形控件背景的位图;5、修改对话框的初始化函数BOOL CTreeDlg::OnInitDialog();6、添加代码,编译运行程序。
三、实现代码/////////////////////////////////////////////////#if !defined(AFX_TREEDLG_H__D82DB384_F574_44A7_96DA_6EC9068E22B1__INC LUDED_)#defineAFX_TREEDLG_H__D82DB384_F574_44A7_96DA_6EC9068E22B1__INCLUDED_ #if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/////////////////////////////////////////// CTreeDlg dialog#include "MyTreeCtrl.h"class CTreeDlg : public CDialog{// Constructionpublic:CTreeDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CTreeDlg)enum { IDD = IDD_TREE_DIALOG };CMyTreeCtrl m_CtrlTree;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CTreeDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CTreeDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();//}}AFX_MSGDECLARE_MESSAGE_MAP()};#endif////////////////////////////////// MyTreeCtrl.cpp : implementation file#include "StdAfx.h"#include "Tree.h"#include "MyTreeCtrl.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif////////////////////////////// CMyTreeCtrlCMyTreeCtrl::CMyTreeCtrl(){}CMyTreeCtrl::~CMyTreeCtrl(){}BEGIN_MESSAGE_MAP(CMyTreeCtrl, CTreeCtrl)//{{AFX_MSG_MAP(CMyTreeCtrl)ON_WM_PAINT()ON_WM_ERASEBKGND()ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnItemexpanded)ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyTreeCtrl message handlersBOOL CMyTreeCtrl::SetBKImage(LPCTSTR LpszResource){// if this is not the first call then delete gdi objectsif( m_bitmap.m_hObject != NULL )m_bitmap.DeleteObject();HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), LpszResource, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);if( hbmp == NULL )return FALSE;m_bitmap.Attach( hbmp );return TRUE;}LRESULT CMyTreeCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){// TODO: Add your specialized code here and/or call the base classreturn CTreeCtrl::WindowProc(message, wParam, lParam);}void CMyTreeCtrl::OnPaint(){CPaintDC dc(this); // device context for paintingCRect rcclient;GetClientRect(&rcclient);// create a compatible memory dcCDC memdc;memdc.CreateCompatibleDC(&dc);CBitmap bitmap;bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height()); memdc.SelectObject( &bitmap );CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);CDC maskdc;maskdc.CreateCompatibleDC(&dc);CBitmap maskbitmap;maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL); maskdc.SelectObject( &maskbitmap );maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc,rcclient.left, rcclient.top, SRCCOPY);CBrush brush;brush.CreatePatternBrush(&m_bitmap);dc.FillRect(rcclient, &brush);memdc.SetBkColor(RGB(0,0,0));memdc.SetTextColor(RGB(255,255,255));memdc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), &maskdc, rcclient.left, rcclient.top, SRCAND);dc.SetBkColor(RGB(255,255,255));dc.SetTextColor(RGB(0,0,0));dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), &maskdc, rcclient.left, rcclient.top, SRCAND);dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), &memdc, rcclient.left, rcclient.top,SRCPAINT);brush.DeleteObject();}BOOL CMyTreeCtrl::OnEraseBkgnd(CDC* pDC){// TODO: Add your message handler code here and/or call defaultreturn TRUE;}void CMyTreeCtrl::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult){NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;// TODO: Add your control notification handler code hereInvalidate();SetRedraw(TRUE);*pResult = 0;}void CMyTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult){NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;// TODO: Add your control notification handler code hereSetRedraw(FALSE);*pResult = 0;}///////////////////////////////////////////////////////BOOL CTreeDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu-> AppendMenu(MF_SEPARATOR);pSysMenu-> AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application''s main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big icon// TODO: Add extra initialization herem_CtrlTree.SetBKImage("IDB_BITMAP1");SetIcon(m_hIcon, FALSE); // Set small iconTVINSERTSTRUCT tvInsert;tvInsert.hParent = NULL;tvInsert.hInsertAfter = NULL;tvInsert.item.mask = TVIF_TEXT;tvInsert.item.pszText = _T("Visual C++编程实例");HTREEITEM hCountry = m_CtrlTree.InsertItem(&tvInsert);HTREEITEM hPA = m_CtrlTree.InsertItem(TVIF_TEXT,_T("文章中心"), 0, 0, 0, 0, 0, hCountry, NULL);HTREEITEM hWA = m_CtrlTree.InsertItem(_T("代码中心"),0, 0, hCountry, hPA); m_CtrlTree.InsertItem(_T("全屏幕程序的实现"), hPA, TVI_SORT);m_CtrlTree.InsertItem(_T("实现窗口的任意分割"), hPA, TVI_SORT);m_CtrlTree.InsertItem(_T("实现菜单的自绘"), hPA, TVI_SORT);m_CtrlTree.InsertItem(_T("实现全屏幕显示的代码"), hWA, TVI_SORT);m_CtrlTree.InsertItem(_T("窗口任意分割的代码"), hWA, TVI_SORT);m_CtrlTree.InsertItem(_T("菜单自绘代码"), hWA, TVI_SORT);m_CtrlTree.Expand(hCountry,TVE_EXPAND);return TRUE; // return TRUE unless you set the focus to a control}四、小结到此为止,本例通过实现树形控件的背景位图介绍了一些树视图控件编程方法,包括树视图控件的建立、节点值的赋予等。