TreeView 派生类: TreeViewEx 实现 NodeShowToolTip、NodeDo

// playyuer@Microshaoft.com invent
//一个 TreeView 的派生类: TreeViewEx 实现 NodeShowToolTip、NodeDoubleClick 事件
//1.实现了 NodeShowToolTip 事件,结合键盘 Ctrl 键显示及设置 ToolTipText
//2.实现了 NodeDoubleClick 事件,可在调用中只响应"叶子"节点
//3.点击 TreeView 空白处不选中任何节点
//Class1.cs
using System;
public class TreeViewEx : System.Windows.Forms.TreeView
{
    public event TreeViewExEventHandler NodeDoubleClick;
    public event TreeViewExEventHandler NodeShowToolTip;
    private void OnNodeDoubleClick(System.Windows.Forms.TreeNode xx)
    {
        if(this.NodeDoubleClick != null)
        {
            this.NodeDoubleClick(this,new TreeViewExEventArgs(xx));
        }
    }
    private void OnNodeShowToolTip(System.Windows.Forms.TreeNode xx, System.Windows.Forms.ToolTip yy)
    {
        if(this.NodeShowToolTip != null)
        {
            if ((xx != null) && (this.toolTip !=null))
                this.NodeShowToolTip(this,new TreeViewExEventArgs(xx,this.toolTip));
        }
    }
    protected override void OnDoubleClick(System.EventArgs e)
    {
        if (this.SelectedNode != null)
            this.OnNodeDoubleClick(this.SelectedNode);
        base.OnDoubleClick(e);
    }
    private System.Windows.Forms.ToolTip toolTip;
    public TreeViewEx()
    {
        toolTip = new System.Windows.Forms.ToolTip();
        this.toolTip.InitialDelay = 300;
        this.toolTip.ReshowDelay = 0;
    }
    protected override void OnClick (System.EventArgs e)
    {
        if (this.GetNodeAt(System.Windows.Forms.TreeView.MousePosition.X,System.Windows.Forms.TreeView.MousePosition.Y) == null)
            this.SelectedNode = null;
        base.OnClick(e);
    }
    protected override void OnMouseDown (System.Windows.Forms.MouseEventArgs e)
    {
        if (this.GetNodeAt(e.X,e.Y) == null)
            this.SelectedNode = null;
        base.OnMouseDown(e);

    }
    private System.Windows.Forms.TreeNode LastTreeNode;
    protected override void OnMouseMove (System.Windows.Forms.MouseEventArgs e)
    {
        this.Cursor = System.Windows.Forms.Cursors.Default ;
        System.Windows.Forms.TreeNode treeNode;
        treeNode = this.GetNodeAt(e.X,e.Y) ;
        if(treeNode != null)
        {
            if( (System.Windows.Forms.Control.ModifierKeys & System.Windows.Forms.Keys.Control) != 0)
            {
                this.Cursor = System.Windows.Forms.Cursors.Hand ;
                if(treeNode != LastTreeNode | LastTreeNode ==null )
                {
                    LastTreeNode = treeNode;
                    this.toolTip.Active = false;
                    this.OnNodeShowToolTip(treeNode,this.toolTip);
                    this.toolTip.Active = true;
                }
            }
            else
            {
                this.Cursor = System.Windows.Forms.Cursors.Default ;
                this.toolTip.Active = false;
            }
        }
        else
        {
            this.Cursor = System.Windows.Forms.Cursors.Default ;
            this.toolTip.Active = false;
        }
        base.OnMouseMove(e);
    }
}
public delegate void TreeViewExEventHandler(object sender,TreeViewExEventArgs e);
public class TreeViewExEventArgs : System.EventArgs
{
    public TreeViewExEventArgs(System.Windows.Forms.TreeNode SelectedNode)
    {
        this.m_SelectedNode = SelectedNode;
    }
    public TreeViewExEventArgs(System.Windows.Forms.TreeNode Node,System.Windows.Forms.ToolTip NodeToolTip)
    {
        this.m_NodeToolTip = NodeToolTip;
        this.m_Node = Node;
    }
    public TreeViewExEventArgs(System.Windows.Forms.TreeNode Node,string ToolTipText)
    {
        this.m_ToolTipText = ToolTipText;
    }
    private string m_ToolTipText;
    private System.Windows.Forms.ToolTip m_NodeToolTip;
    private System.Windows.Forms.TreeNode m_SelectedNode;
    private System.Windows.Forms.TreeNode m_Node;
    public System.Windows.Forms.TreeNode SelectedNode
    {
        get
        {
            return this.m_SelectedNode;
        }
    }
    public string ToolTipText
    {
        get
        {
            return this.ToolTipText;
        }
        set{m_ToolTipText = value;}
    }
    public System.Windows.Forms.TreeNode Node
    {
        get
        {
            return this.m_Node;
        }
    }
    public System.Windows.Forms.ToolTip NodeToolTip
    {
        get
        {
            return this.m_NodeToolTip;
        }
    }
}
public class TreeNodeEx : System.Windows.Forms.TreeNode
{
    public int GetLevel()
    {
        int i = 0;
        System.Windows.Forms.TreeNode xx =this.Parent;
        while ((xx = xx.Parent) != null) i++;
        return i;
    }
}

//=================================================================
//调用示例
    private TreeViewEx treeViewEx1;
    private void Form1_Load(object sender, System.EventArgs e)
    {
        treeViewEx1 = new TreeViewEx();
        this.Controls.Add(treeViewEx1);
        treeViewEx1.HideSelection=false;
        treeViewEx1.NodeDoubleClick +=new TreeViewExEventHandler(treeViewEx1_NodeDoubleClick);
        treeViewEx1.NodeShowToolTip += new TreeViewExEventHandler(this.treeViewEx1_NodeShowToolTip);
        treeViewEx1.Nodes.AddRange(new System.Windows.Forms.TreeNode[]{
                                                                          new System.Windows.Forms.TreeNode("Root",
                                                                          new System.Windows.Forms.TreeNode[]
{new System.Windows.Forms.TreeNode("a"),new System.Windows.Forms.TreeNode("b")}
                                                                          ),
                                                                          new System.Windows.Forms.TreeNode("Root1",
                                                                          new System.Windows.Forms.TreeNode[]
{new System.Windows.Forms.TreeNode("a1"),new System.Windows.Forms.TreeNode("b1")}
                                                                          )
                                                                      }
            );
    }

    public void treeViewEx1_NodeShowToolTip (object sender,TreeViewExEventArgs e)
    {
        e.NodeToolTip.SetToolTip (this.treeViewEx1,"[" + e.Node.Text + "]{" );
    }

    private void treeViewEx1_NodeDoubleClick(object sender, TreeViewExEventArgs e)
    {
        if (e.SelectedNode.GetNodeCount(true)==0 )
            System.Windows.Forms.MessageBox.Show(e.SelectedNode.Text);
  &nb

时间: 2024-10-27 08:03:51

TreeView 派生类: TreeViewEx 实现 NodeShowToolTip、NodeDo的相关文章

TreeView 派生类: TreeViewEx 实现 NodeShowToolTip、NodeDoubleClick 事件

treeview // playyuer@Microshaoft.com invent//一个 TreeView 的派生类: TreeViewEx 实现 NodeShowToolTip.NodeDoubleClick 事件//1.实现了 NodeShowToolTip 事件,结合键盘 Ctrl 键显示及设置 ToolTipText//2.实现了 NodeDoubleClick 事件,可在调用中只响应"叶子"节点//3.点击 TreeView 空白处不选中任何节点//Class1.csu

派生类-c++继承的时候同名函数的遮蔽问题

问题描述 c++继承的时候同名函数的遮蔽问题 派生类的函数和基类的函数同名时应该派生类的的遮蔽基类的,为什么这个程序最后运行的是基类的函数? 解决方案 因为楼主基类的display函数不是虚函数C++重要性质:1.如果你以一个""基类之指针""指向一个""派生类之对象"",那么经由该指针你只能调用该基类所定义的函数2.如果你以一个"派生类之指针"指向一个"基类之对象",你必须先做明显的转

派生类与派生类对象对基类成员的访问

区分"派生类对象"和"派生类"对基类成员的访问权限.    "派生类对象"对基类成员的访问权限:      (1)对于公有继承,只有基类的公有成员可以被"派生类对象"访问,其他(保护和私有)成员不能被访问.      (2)对于私有继承和保护继承,基类中所有成员都不能被"派生类对象"访问.    "派生类"对基类中成员的访问权限:     (1)对于公有继承,基类中的公有成员和保护成

C++中派生类的构造和析构顺序详解

派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行; 构造的顺序是: 基(base) -> 派生(derived);即先构造基类, 再构造派生类; 因为 基类 是独立于派生类的, 即不会调用派生类中的对象, 所以应该先被生成; 如果派生类先于基类生成, 则因为无法调用基类资源, 可能生成失败; 析构的顺序是: 派生(derived) -> 基(base); 即先释放派生类, 再释放基类; 因为 派生类 需要先释放调用的基类资源, 所以应该优先释放; 如果基类先析构, 则有可能某些资源被

C++:阻止派生类(derived class)重新定义虚函数(final&sealed)

阻止派生类重新定义虚函数, 在java和C#中可以很简单的实现(finale&sealed), 但在C++中则需要使用public继承+复合(composition)的方法; 注意: 使用私有继承(private), 无法实现此要求. 如: /************************************************* File: test.cpp Copyright: C.L.Wang Author: C.L.Wang Date: 2014-04-11 Descripti

C++:派生类访问模板化基类(templatized base class)的命名

派生类继承模板化基类的成员函数, 默认是无法访问, 模板化基类的命名. 原因是模板的定制化有可能取消某些函数, 为了能在编译期检测出错误, 所以默认无法访问. 派生类访问模板化基类, 包含三种方法: 1. 调用基类函数时, 使用"this->", 指明调用的类, 是本类, 在编译时, 可以进行检查; 2. 使用using声明式, 可以把基类的函数引入派生类, 在编译时, 可以进行检查; 3. 使用显示修饰(explicit qualification), 不推荐, 显示修饰会屏蔽

C++:派生类强制转换为基类

在多态的使用时, 派生类的指针或引用可以转换为基类的指针或引用, 即基类的指针可以指向派生类的基类部分; Base* b = Derived* d; b和d指向的内容是相等的, b == d, 因为之间有一个隐式转换即 b == (Base*)d; b和d的地址是不同的 int(b) != int(d), 因为b指向d的基类部分, d指向的是完整的派生类; 但如果进行隐身转换, int(b) != int((Base*)d), 则地址相同. 代码如下: /* * test.cpp * * Cre

C#高级(五)继承,派生类,派生类的构造方法

一.基本概念 首先我们来了解两个基本概念:实现继承和接口继承 (1).实现继承,表示一个类派生于一个基类型,并拥有该基类型的所有成员字段和函数. (2).接口继承,表示一个类型只继承了函数的签名,没有任何实现的代码.在需要指定该类型具有某些可用的特性时,最好使用这种继承. 注意,在C#中,不支持多重继承,但一个类却可以实现多个接口.同样,结构总是派生于System.ValueType , 他们还可以派生于任意多个接口. 二.实现继承. (1).我们先来看个例子. using System;nam

在派生类中对虚方法进行重载

先让我们回顾一下普通的方法重载.普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法. 而对基类虚方法的重载是函数重载的另一种特殊形式.在派生类中重新定义此虚函数时,要求的是方法名称.返回值类型.参数表中的参数个数.类型.顺序都必须与基类中的虚函数完全一致.在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符. 还是让我