TreeView详解

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 控件的节点集合的方法(被指定的 .Nodes 引用, 其中 是 TreeView 控件名): Add: 添加一个新节点并返回它的引用。 它使用以下语法 .Nodes.Add(Relative, Relationship, Key, Text, Image, ; SelectedImage) 其中: Relative: 一个已存在节点的索引或键值。 如果未指定, 新节点放在顶级节点的末端。 Relationship: 新节点放置的相对于第一个参数中指定的节点的位置,可以是以下值: 1: 节点放在相对节点所在级的所有节点的末端。 2: 节点放在相对节点的后面。 3: 节点放在相对节点的前面。 4: 节点成为相对节点的子节点。 Key: 用于指明节点的唯一串。 如果显示内容是从一个表的记录中载入的, 可使用记录的主关键字段值 (如果不是字符型的,还需要转换为字符型)。 否则, 可使用一个转换为串的顺序号。 Text: 控件节点中显示的文本。 Image: 相关 ImageList 控件中的图象索引。 SelectedImage: 当节点选定时,要显示的相关 ImageList 控件中的图象索引。 Clear: 清除全部节点。 Remove: 移去指定索引号的节点。 TreeView 控件节点集合属性 以下是节点集合属性: Count: 节点号。 [ ]: 一个节点号的对象引用。 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 注意你需要在表单的 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 事件之前。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值