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 控件的节点集合的方法(被指定的