控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

DotNetBar的SuperTooltip控件使用技巧

作者:网友 出处:博客园 2010年07月20日 阅读:

DotNetBar是一个顶尖的.net第三方表示层空间。作出来的窗口可以说是非常非常非常的cool!SuperTooltip控件主要可以用于实现提示框。在它提供的sample中,实现了树视图中,鼠标移动到树节点上时显示的提示框。

我的一个项目中用到了树视图,在项目完成以后我决定把它用DotNetBar美化一下。在参考着sample的代码对我的代码进行修改和调试的过程中,我发现sample的代码并不是拿来用就行了的,还是需要理解以后进行修改。

按照sample的代码,假设我们的Form Form1中有控件TreeView treeView1,那么为treeView1实现提示框的方法如下:(我没用窗口编辑器,只修改代码来着)

1 在项目的引用中添加DevComponents.DotNetBar。新建一个类NodeSuperTooltipProvider,将sample中的这个类的代码复制过来。注意,如果你的程序里的树节点不是用的.net自带组件TreeNode,而是从TreeNode继承而来的自定义类型,那么将以下所有代码中的TreeNode都改成你自定义的类型,并且很多地方也要加入强制类型转换。

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace SuperTooltip
{
/// <summary>
/// Wrapper so SuperTooltips can be displayed for node objects.
/// </summary>
public class NodeSuperTooltipProvider : Component, DevComponents.DotNetBar.ISuperTooltipInfoProvider
{
   private TreeNode m_Node=null;

   /// <summary>
   /// Creates new instance of the object.
   /// </summary>
   /// <param name="node">Node to provide tooltip information for</param>
   public NodeSuperTooltipProvider(TreeNode node)
   {
    m_Node=node;
   }

   /// <summary>
   /// Call this method to show tooltip for given node.
   /// </summary>
   public void Show()
   {
    if(this.DisplayTooltip!=null)
     DisplayTooltip(this,new EventArgs());
   }

   /// <summary>
   /// Call this method to hide tooltip for given node.
   /// </summary>
   public void Hide()
   {
    if(this.HideTooltip!=null)
     this.HideTooltip(this,new EventArgs());
   }

   #region ISuperTooltipInfoProvider Members

   /// <summary>
   /// Returns screen coordinates of object.
   /// </summary>
   public System.Drawing.Rectangle ComponentRectangle
   {
    get
    {
     Rectangle r=m_Node.Bounds;
     r.Location=m_Node.TreeView.PointToScreen(r.Location);
     return r;
    }
   }

   public event EventHandler DisplayTooltip;
   public event EventHandler HideTooltip;

   #endregion
}
}

2 在Form1种添加控件:

private DevComponents.DotNetBar.SuperTooltip superTooltip1;
private System.Windows.Forms.Timer tooltipDisplayDelay;

一个是SuperTooltip,另一个是.net本身带的Timer,用于控制提示框显示的时间。

3 Form1中的InitializeComponent()函数中添加:

this.components = new System.ComponentModel.Container();
this.superTooltip1 = new DevComponents.DotNetBar.SuperTooltip();
this.tooltipDisplayDelay = new System.Windows.Forms.Timer(this.components);

需要初始化components是因为那个Timer初始化的时候要用。不过去掉可以不可以我也没试过……

//
// superTooltip1
//
this.superTooltip1.DefaultFont = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
//
// tooltipDisplayDelay
//
this.tooltipDisplayDelay.Interval = 1000;

4 写一个生成所有节点的提示框的函数:

private superTooltip_Refresh()
{
// Load SuperTooltip information for each node...
TreeNode node=treeView1.Nodes[0];
while(node!=null)
{
   // Creates wrapper to provide SuperTooltip control access to the node object
   NodeSuperTooltipProvider sp=new NodeSuperTooltipProvider(node);
   node.Tag=sp;
   // Assign the wrapper to SuperTooltip control together with information
   // about what to display on Super Tooltip for this node.
   superTooltip1.SetSuperTooltip(sp,new DevComponents.DotNetBar.SuperTooltipInfo([header_text],"",[additional_text],null,null,DevComponents.DotNetBar.eTooltipColor.Lemon));
   // Must expand node to get to the child nodes via NextVisibleNode
   node.Expand();
   node=node.NextVisibleNode;
}
}

其中[header_text]和[additional_text]处添加希望在提示框中显示的string。[header_text]会被加粗。另外,SuperTooltipInfo的最后一个参数用来改变颜色。

本来这些代码在sample里面是写在Form1的Load事件函数里面的,但是一般来说用到树视图的程序都会对节点进行各种操作,比如添加、删除、修改等等。我设计的提示框中显示的是节点的Text、它子节点的Text和它父节点的Text。开始我按照sample的代码把这些代码写在Form1的Load事件函数中,结果当我删除了一个节点时,它父节点的提示框内容并没有改变。其原因就是以上这段生成每个节点的提示框的代码只在Form1生成的时候才调用Load事件函数,而改变树视图后并不重新生成。所以,我把这些代码单独写在一个函数中,并在Form1的Load事件函数中调用它,并且在我对树和节点进行操作以后也会调用它,以刷新所有的提示框。

5 Form1的Load事件函数,每个添加、修改、删除节点的button、menuItem等对象的Click事件函数的最后加入代码:

this.superTooltip_Refresh();

6 定义一个TreeNode私有属性:

private TreeNode m_LastMouseOverNode = null;

7 treeView1的MouseMove事件函数:

TreeNode nodeAt=treeView1.GetNodeAt(e.X,e.Y);
if(nodeAt!=m_LastMouseOverNode)
{
   HideNodeTooltip();
   if(nodeAt!=null)
   {
    m_LastMouseOverNode=nodeAt;
    // Delayed display
    tooltipDisplayDelay.Start();
   }
}

8 treeView1的MouseDown事件函数:

// Hide tooltip if any is visible...
HideNodeTooltip();

9 treeView1的MouseLeave事件函数:

// Hide tooltip when mouse leaves tree control
HideNodeTooltip();
tooltipDisplayDelay.Stop();

10 tooltipDisplayDelay的Tick事件函数:

tooltipDisplayDelay.Stop();
if(m_LastMouseOverNode!=null)
   ShowNodeTooltip(m_LastMouseOverNode);

11 ShowNodeTooltip和HideNodeTooltip函数:

private void ShowNodeTooltip(TreeNode node)
{
if(node==null)
   return;
NodeSuperTooltipProvider sp=node.Tag as NodeSuperTooltipProvider;
sp.Show();
m_LastMouseOverNode=node;
}

private void HideNodeTooltip()
{
if(m_LastMouseOverNode!=null)
{
   NodeSuperTooltipProvider sp=m_LastMouseOverNode.Tag as NodeSuperTooltipProvider;
   sp.Hide();
   m_LastMouseOverNode=null;
}
}

12 以上6-11步,都是sample代码中原封不动搬来的,但是运行的时候有一个重大问题,就是当我添加一个节点以后,当我的鼠标移动到新节点上时,会出现Null异常。经过调试,我发现异常出现在ShowNodeTooltip和HideNodeTooltip函数中的局部变量sp上。关于sp的初始化的代码如下:

// ShowNodeTooltip()
NodeSuperTooltipProvider sp=node.Tag as NodeSuperTooltipProvider;

// HideNodeTooltip()
NodeSuperTooltipProvider sp=m_LastMouseOverNode.Tag as NodeSuperTooltipProvider;

而前面有这样的代码段:
// Creates wrapper to provide SuperTooltip control access to the node object
NodeSuperTooltipProvider sp=new NodeSuperTooltipProvider(node);
node.Tag=sp;

可以看出,SuperTooltip控件是将NodeSuperTooltipProvider的实例赋给节点的Tag以实现提示框的功能。所以,如果我们没有对新建节点的Tag进行赋值,就会出现Null异常。

实际上,如果每当添加一个节点时都调用前面的superTooltip_Refresh(),就不存在这样的异常。但是,并不是每个程序都需要有这样一个刷新提示框的函数,也许某些程序提示框中的内容是固定的。

在这种程序中,修复这个bug的方法有两种:

第一种,就是如果你的节点是从TreeNode继承而来的自定义类,那么在该类的所有构造函数中都加入如下程序段:

this.Tag = new NodeSuperTooltipProvider(this);

第二种,就是如果你的节点用的就是TreeNode组件,那么就要在添加节点的所有button和menuItem等对象的Click事件结尾加入:

[node_name].Tag = new NodeSuperTooltipProvider([node_name]); // [node_name]是新建节点在函数中的标识符。

至此,我们的树视图中提示框的功能就实现了。

产品下载地址:http://www.componentcn.com/html/cpjmtb_243_5606.html

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统