您的位置:首页 > 职场人生

TreeView详解(转载)

2010-06-22 15:09 295 查看
TreeView详解(转载)
TreeView 控件响应一些我们觉的VFP 控件的方法和事件: Click, DblClick, Drag, DragDrop, DragOver, GotFocus, KeyDown, KeyPress, KeyUp, LostFocus, MouseDown, MouseMove, MouseUp, Move, Refresh, SetFocus, ShowWhatsThis, 和 ZOrder。 有一个很大的例外: 没有 RightClick 事件。在稍后,你会看到如何处理这种情况。
除这些方法和事件外,TreeView 控件有一些它自己的方法和事件(帮助文件中列出的 Clear 和 Remove 方法, 实际上是属性节点集合而不是 TreeView 控件自己的):
BeforeLabelEdit 和 AfterLabelEdit 发生在标签被用户修改前和修改后(就象在 Windows 的资源管理器中, 你可以单击选定的节点并修改它的文本(在稍后你可以看到如何废止该自动编辑功能)。 该事件中的代码通常用于在某处保存新的文本, 如一个表中的字段。
Collapse 和 Expand 当用户收缩或扩展一个节点时激发。 它们接受的参数是选定节点的对象。 收缩或扩展一个节点不会使该节点成为活动的节点, 这一点通常会使用户糊涂。 添加以下代码到 Collapse 和 Expand 事件来确保存该节点成为活动的节点(调用了我将在稍解释的 NodeClick(), 它们只在你在这些方法中有一些自定义代码是才是必须的):
lparameters node
Node.Selected = .T.
This.NodeClick(Node)
GetVisibleCount 显示控件中全部可见的节点数。 如果控件可以显示最后的节点,该数可能看起来会很小。
HitTest :如果传递的 X 和 Y 座标上存在节点,它返回一个节点对象引用,否则返回 .NULL. 这里有一个新的问题: HitTest 期待 X 和 Y 座标值是缇(twips) (用于 Visual Basic), 但 VFP 使用象素。 以下代码将转换象素值到缇。TREEVIEW 示例表单的 INIT 中有这些代码, 并有两个自定义属性来保存计算值: nTreeFactorX 和 nTreeFactorY。
local liHWnd, ;
liHDC, ;
liPixelsPerInchX, ;
liPixelsPerInchY
* 定义一些常数。
#define cnLOG_PIXELS_X 88
* 来自 WINGDI.H
#define cnLOG_PIXELS_Y 90
* 来自From WINGDI.H
#define cnTWIPS_PER_INCH 1440
* 每英寸1440 缇
* 定义一些 Windows API 函数
declare integer GetActiveWindow in WIN32API
declare integer GetDC in WIN32API ;
integer iHDC
declare integer GetDeviceCaps in WIN32API ;
integer iHDC, integer iIndex
* 为 VFP 取得图形设备(device context)。
liHWnd = GetActiveWindow()
liHDC = GetDC(liHWnd)
* 取得每英寸象素值。
liPixelsPerInchX = GetDeviceCaps(liHDC, cnLOG_PIXELS_X)
liPixelsPerInchY = GetDeviceCaps(liHDC, cnLOG_PIXELS_Y)
* 取得每象素缇并保存到表单属性中。
with This
.nTreeFactorX = cnTWIPS_PER_INCH/liPixelsPerInchX
.nTreeFactorY = cnTWIPS_PER_INCH/liPixelsPerInchY
endwith
HitTest() 有助于解决一个处理鼠标右击事件。 你可能想在用户在节点上右击时显示弹式菜单, 但在节点上右击时不会使它成为选定节点。 在控件的 MouseDown 事件中用以下代码来处理这一点(因为没有 RightClick 事件,所以这是你能处理右击的唯一办法)。 同时, 调用 NodeClick() 仅当你在该方法中放有代码时才是必须的:
lparameters Button, Shift, X, Y
local loNode
if Button = 2
* 如果这是右鼠标键, 取得鼠标下的节点的引用。
loNode = This.HitTest(X * Thisform.nTreeFactorX, ;
Y * Thisform.nTreeFactorX)
* 如果有可用的节点, 选择它。
if not isnull(loNode)
loNode.Selected = .T.
This.NodeClick(loNode)
endif not isnull(loNode)
* 现在显示右击快捷菜单
else
* 处理必要的鼠标左击
endif Button = 2
NodeClick: 当用户在节点上单击时激活 (在 Click 事件之前)。 NodeClick 接受一个选定节点的对象引用作为参数。 该方法被典型地用于在一个节点被选定时更新一些东西(例如其它控件的值)。 如果 NodeClick 中的代码执行时花的时间太长, 选定项会被高亮显示但以前的项会被断续线包围。 移动鼠标(即使没有单击鼠标按钮) 会恢复以前项的高亮显示。 要避免这一问题, 可以在 NodeClick 事件中放入以下代码来保证节点被单击而成为选定项:
Node.Selected = .T.
StartLabelEdit: 通常被用于编辑节点的标签。 它用于 LabelEdit 属性被设置为1-手动时。
TreeView 控件节点集合方法
以下是TreeView 控件的节点集合的方法(被指定的 <Object>.Nodes 引用, 其中 <Object> 是 TreeView 控件名):
Add: 添加一个新节点并返回它的引用。 它使用以下语法
<Object>.Nodes.Add(Relative, Relationship, Key, Text, Image, ;
SelectedImage)
其中:
Relative: 一个已存在节点的索引或键值。 如果未指定, 新节点放在顶级节点的末端。
Relationship: 新节点放置的相对于第一个参数中指定的节点的位置,可以是以下值:
1: 节点放在相对节点所在级的所有节点的末端。
2: 节点放在相对节点的后面。
3: 节点放在相对节点的前面。
4: 节点成为相对节点的子节点。
Key: 用于指明节点的唯一串。 如果显示内容是从一个表的记录中载入的, 可使用记录的主关键字段值 (如果不是字符型的,还需要转换为字符型)。 否则, 可使用一个转换为串的顺序号。
Text: 控件节点中显示的文本。
Image: 相关 ImageList 控件中的图象索引。
SelectedImage: 当节点选定时,要显示的相关 ImageList 控件中的图象索引。
Clear: 清除全部节点。
Remove: 移去指定索引号的节点。
TreeView 控件节点集合属性
以下是节点集合属性:
Count: 节点号。
[<Index>]: 一个节点号的对象引用。
Treeview(续2)
TreeView 控件节点对象方法
以下是节点对象方法:
CreateDragImage: 该方法不能用于 VFP ,因为该方法返回一个图象时, DragIcon 需要一个 CUR 文件名。
EnsureVisible: 确保指定节点是可见的。 该方法在必要时卷动 TreeView 控件并扩展所有指定节点的父节点。
TreeView 控件节点对象属性
以下是节点对象属性:
Children: 如果节点对象拥有子节点,该值为.T.。
Expanded: 如果节点对象已经扩展,该值为.T.。
FullPath: 该节点的所有父节点(祖节点,曾祖节点等)的文本串接, 各节点的文本间用控件的 PathSeparator 属性中指定的分隔符分隔。它非常类似于带路么的文件名。
Image, ExpandedImage 和 SelectedImage: 相关ImageList 控件中的适当的图象号。
Index: 节点集合中的节点对象的索引。
Key: 当节点添加时指定的唯一键值。
Child, FirstSibling, LastSibling, Previous, Parent, Next 和 Root: 指向与指定节点相关的节点对象。
Selected: 如果节点对象是选定的,该值为.T.。 设置该属性为 .T. 会自动高亮显示该节点并设置先前选定的节点的 Selected 属性为 .F.
Text: 控件中显示的文本。
TreeView 控件属性
如同事件一样, TreeView 控件支持一些其它控件所拥有的属性, 包括 DragIcon, DragMode, Enabled 和 Visible。 许多 TreeView 特定属性可以在设计时在 TreeView 控件上单击鼠标右键调出的 TreeView 控件属性表中设置。 包括 Style, LineStyle, Indentation, PathSeparator 和 HideSelection。
在属性表中可编辑的属性中, 你最需要改变其默认值的是:
Style: 指明 TreeView 控件显示什么。 可以选择是否显示图像,线条, 加号/减号等。
LineStyle: 指明显示根线。 如果没有设置该属性为 1-根线, 无论 Style 是如何设置的,顶级对象上都不会有加号/减号标记。
LabelEdit: 如果你不想让用户修改各节点上的文本, 设置该属性为 1-手动。
ImageList: 一个 ImageList 控件对象引用,它包括了控件中的节点使用的图象; 参见本文 ImageList 一章中关于该简单控件的说明。 不幸的是,该属性不能可视化地进行设置; 你必须以编程方式用代码进行设置,象下面一样在表单的 Init 方法中:
This.oTree.ImageList = This.oImageList.Object
***********************以下代码为我Appler整理*********************
在表单上添加一个TreeView,把TreeView的 NAME 值修改为 TreeView1,
然后再在在表单中添加一个ImageList控件(Microsoft ImageList Control),
然后把这个ImageList控件的 NAME 值改为ImageList1
右击这个控件,在ImageListCtrl Properties中的Images中添加几个图片
最后在表单的INIT事件:
This.TreeView1.ImageList=This.ImageList1.Object
this.TreeView1.Nodes.Add(,,,"Node 1")
this.TreeView1.Nodes.Add(,,,"Node 2")
THIS.TreeView1.Nodes(1).IMAGE=1 &&这里1表示节点图片为Images控件中的第1个图片
THIS.TreeView1.Nodes(2).IMAGE=2 &&这里2表示节点图片为Images控件中的第2个图片
THIS.TreeView1.Nodes(3).IMAGE=3 &&这里1表示节点图片为Images控件中的第3个图片
THIS.TreeView1.Nodes(4).IMAGE=4 &&这里2表示节点图片为Images控件中的第4个图片

FOR I=1 TO THIS.TreeView1.GetVisibleCount &&取得的节点数最小为4
THIS.TreeView1.Nodes(I).IMAGE=1
ENDFOR
******************************************************************
***********************以下代码为我Appler整理*********************
使TreeView控件不可用:
THISFORM.TreeView1.OBJECT.ENABLED=.F. &&即在Enabled属性前加OBJECT
******************************************************************
注意你需要在表单的 Init 事件中而不是 TreeView 的 Init 事件中进行上述设置, 因为 TreeView 可能会在 ImageList 之前实例化, 如果这样,试着设置 ImageList 属性为一个尚不存在的对象将会失败。 同时, 注意上述代码中的"object" 关键字; 这是必须的。
Indentation: 子节点缩进多少。
HideSelection: 如果没有关闭这一选项, 当 TreeView 控件失去焦点时,选定节点不会保持高亮度。 这很容易把用户糊涂。
Font: 用于节点文本的字体名字, 字号和字型。该属性可从属性表中修改(注意帮助文件中说明了 ScrollBars 属性, 但没有该属性)。
DropHighlight: 该属性用于支持TreeView 控件的 DragOver 事件, 因此可以在鼠标经过一个节点时,高亮显示该节点。 但是, 这只会在 VFP 6 中的版本 6 的 TreeView 控件中才实现了; 在老版本的控件中设置该属性为节点对象时,会引发一条"类型失配" 错误。 在这种情况下, 要达到同样目的,可用 HitTest() 来检查鼠标经过的是哪一节点并设置该节点的 Selected 属性为 .T. TREEVIEW 示例表单在 DragOver 事件中使用了该技术。
Nodes: 控件中的节点集合引用。
SelectedItem: 当前选定节点对象的引用。
数据库加密程序(源码)
*******************************************
*加解密程序filename文件名jm为1加密0解密
*加密思想:用低级文件函数改写数据库第一个字节
*******************************************
parameters filename,jm
*处理文件名
if at('.',filename)=0
filename=filename+'.dbf'
endif
if jm=1 &&加密
handle=fopen(filename,2) &&打开文件
keybite=fread(handle,1) &&读表头第一个字节
=fseek(handle,0) &&指针移回第一个字节
=fwrite(handle,chr(asc(keybite)+2)) &&用比原来高2的ASCII字符改写
=fclose(handle) &&关闭文件
else &&解密
handle=fopen(filename,2)
keybite=fread(handle,1)
=fseek(handle,0)
=fwrite(handle,chr(asc(keybite)-2)) &&用比原来低2的ASCII字符改写
=fclose(handle)
endif
*****************************************
*经过这样处理过的表就不能用USE打开,优点是加密速度快,但不彻底但用
*一个文本编辑器打开还是可以看到一些东西,怎样进一步加密还有待探讨。
*****************************************
TreeView 控件是在VFP的数据处理中很有用的一个ActiveX 控件,但是VFP的帮助中却没有相关的说明,为帮助大家对这一控件有一个详细的了解,现将TreeView 控件应用详解如下:
??
一、概述
??TreeView 控件显示 Node 对象的分层列表,每个 Node 对象均由一个标签和一个可选的位图组成。TreeView 一般用于显示文档标题、索引入口、磁盘上的文件和目录、或能被有效地分层显示的其它种类信息。创建了 TreeView 控件之后,可以通过设置属性与调用方法对各 Node 对象进行操作,这些操作包括添加、删除、对齐和其它操作。可以编程展开与折回 Node 对象来显示或隐藏所有子节点。Collapse、Expand 和 NodeClick 三个事件也提供编程功能。
??Node 对象使用 Root、Parent、Child、FirstSibling、Next、Previous 和 LastSibling 属性。在代码中可通过检索对 Node 对象的引用,从而在树上定位。也可以使用键盘定位。UP ARROW 键和 DOWN ARROW 键向下循环穿过所有展开的 Node 对象。从左到右、从上到下地选择 Node 对象。若在树的底部,选择便跳回树的顶部,必要时滚动窗口。RIGHT ARROW 键和 LEFT ARROW 键也穿过所有展开的 Node 对象,但是如果选择了未展开的 Node之后再按 RIGHT ARROW 键,该 Node 便展开;第二次按该键,选择将移向下一个 Node。相反,若扩展的 Node 有焦点,这时再按 LEFT ARROW 键,该 Node 便折回。如果按下 ANSI 字符集 中的键,焦点将跳转至以那个字母开头的最近的 Node。后续的按该键的动作将使选择向下循环,穿过以那个字母开头的所有展开节点。

??控件的外观有八种可用的替换样式,它们是文本、位图、直线和 +/- 号的组合,Node 对象可以任一种组合出现。

??TreeView 控件使用由 ImageList 属性指定的 ImageList 控件,来存储显示于 Node 对象的位图和图标。任何时刻,TreeView 控件只能使用一个 ImageList。这意味着,当 TreeView 控件的 Style 属性被设置成显示图象的样式时,TreeView 控件中每一项的旁边都有一个同样大小的图象。

??发行注意 TreeView 控件是 COMCTL32.OCX 文件中的一组 ActiveX 控件的一部分。为了在应用程序中使用 TreeView 控件,必须将 COMCTL32.OCX 文件添加到工程中。在发行应用程序时,要在用户的 Microsoft Windows System 或 System32 目录中安装 COMCTL32.OCX 文件。
Treeview(续3)
二、常用属性
??1、Nodes属性返回对 TreeView 控件的 Node 对象的集合的引用。
?? 语法:object.Nodes
??object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。
??说明:可以使用标准的集合方法(例如 Add 和 Remove 方法)操作 Node 对象。可以按其索引或存储在 Key 属性中的唯一键来访问集合中的每个元素。
??2、Style属性返回或设置图形类型(图象、文本、+/- 号、直线)以及出现在 TreeView 控件中每一 Node 对象上的文本的类型。
??语法:object.Style [ = number]
??Style 语法包含下面部分:
??部分???? 描述
??object 对象表达式,其值是“应用于”列表中的一个对象。
??number 指定图形类型的整数,请参阅“设置值”中的描述。
??设置值
??number 的设置值是:
??设置值 描述
??0 ??仅为文本。
??1 ??图象和文本。
??2 ??+/- 号和文本。
??3 ??+/- 号,图象和文本。
??4 ??直线和文本。
??5 ??直线,图象和文本。
??6 ??直线,+/- 号和文本。
??7 ??(缺省)直线,+/- 号,图象和文本。
??说明:若 Style 属性设置为包含直线的值,则 LineStyle 属性就确定了直线的外观。如果 Style 属性设置为不含直线的值,则 LineStyle 属性将被忽略。

??3、Sorted属性返回或设置一值,此值确定 Node 对象的子节点是否按字母顺序排列;返回或设置一值,此值确定 TreeView 控件的根层节点是否按字母顺序排列。
??语法:object.Sorted [ = boolean]
Sorted 属性语法包含下面部分:
部分 ??描述
object ??对象表达式,其值是“应用于”列表中的一个对象。
boolean ??布尔表达式,表示 Node 对象是否已被排序如“设置值”中描述。
boolean 的设置值是:
设置值 ??描述
True ??Node 对象根据它们的 Text 属性按字母顺序排列。其 Text 属性由数字开始的 Node 对象也作为字符串排序,第一个数字确定在排序中的初始位置,后面的数字确定以后的排序。
False ??Node 对象不排序。
说明:Sorted 属性有两种用法,第一,在 TreeView 控件的根(顶)层排列 Node 对象,第二,对任何单个 Node 对象的立即子节点排序。例如,下面的代码是对 TreeView 控件的根节点排序:
TreeView1.Sorted = True '顶层 Node 对象被排序。
下面的例子表示创建 Node 对象时如何设置 Sorted 属性:
Dim nodX As Node
Set nodX = TreeView1.Nodes.Add(,,,"Parent Node")
nodX.Sorted = True
设置 Sorted 属性为 True 仅对当前 Nodes 集合排序。在 TreeView 控件中添加新的 Node 对象时,必须再次设置 Sorted 属性为 True,以便对添加的 Node 对象排列。??
Treeview(续4)
??
三、常用方法
??1、Add 方法在 Treeview 控件的 Nodes 集合中添加一个 Node 对象。
语法:
object.Add(relative, relationship, key, text, image, selectedimage)
Add 方法的语法包含下面部分:
部分 ????描述
object ????必需的。对象表达式,其值是“应用于”列表中的一个对象
relative ????可选的。已存在的 Node 对象的索引号或键值。新节点与已存在的节点间的关系,可在下一个参数 relationship 中找到。
relationship ??可选的。指定的 Node 对象的相对位置,如设置值中所述。
key ????可选的。唯一的字符串,可用于用 Item 方法检索 Node。
text ????必需的。在 Node 中出现的字符串。
image ????可选的。在关联的 ImageList 控件中的图象的索引。
selectedimage ??可选的。在关联的 ImageList 控件中的图象的索引,在 Node 被选中时显示。
设置值
relationship 的设置值是:
常数 ????值 ??描述
tvwFirst ????0 ??首的节点。该 Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之前。
tvwLast ????1 ??最后的节点。该 Node 和在 relative 中被命名的节点位于同一层,并 位于所有同层节点之后。任何连续地添加的节点可能位于最后添加的节点之后
tvwNext ????2 ??(缺省)下一个节点。该 Node 位于在 relative 中被命名的节点之后。
tvwPrevious ??3 ??前一个节点。该 Node 位于在 relative 中被命名的节点之前。
tvwChild ????4 ??(缺省)子节点。该 Node 成为在 relative 中被命名的节点的子节点。
注意如果在 relative 中没有被命名的 Node 对象,则新节点被放在节点顶层的最后位置。
说明:
Nodes 集合是一个基于 1 的集合。
在添加 Node 对象时,它被指派一个索引号,该索引号被存储在 Node 对象的 Index 属性中。这个最新成员的 Index 属性值就是 Node 集合的 Count 属性的值。
因为 Add 方法返回对新建立的 Node 对象的引用,所以使用这个引用来设置新 Node 的属性十分方便。
??2、GetVisibleCount方法返回固定在 TreeView 控件的内部区域的 Node 对象的个数。
语法:object.GetVisibleCount
object 所在处代表一个对象表达式,其值是“应用于”列表中的一个对象。
说明: Node 对象的个数取决于在一个窗口中能固定多少行。总的行数取决于控件的高度和 Font 对象的 Size 属性。该计数包括列表底部的只能看到一局部的项。
可以使用 GetVisibleCount 属性确保可视的最小行数,这样可以精确地访问一个层。如果最小行数是不可视的,可以用 Height 属性重新设置 TreeView 的大小。
??
四、常用事件
??NodeClick 事件在一个 Node 对象被单击时,这个事件便发生。语法:Private Sub object_NodeClick(ByVal node As Node)
NodeClick 事件的语法包含下面部分::
部分 描述
object 对象表达式,其值是“应用于”列表中的一个对象。
node 对被点取的 Node 对象的引用。
说明:
在单击节点对象之外的 TreeView 控件的任何部位,标准的 Click 事件发生。当单击某个特定的 Node 对象时,NodeClick 事件发生;NodeClick 事件也返回对特定的 Node 对象的引用,在下一步操作之前,这个引用可用来使这个 Node 对象可用。
NodeClick 事件发生在标准的 Click 事件之前。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 TreeView