2012-04-06 74 views
1

我想添加一个ToolTipTreeView节点,使气球出现在鼠标坐标:定位气球工具提示过树节点

private void treeView1_MouseMove(object sender, MouseEventArgs e) 
{ 
    node = treeView1.getNodeAt(e.X, e.Y); 
    toolTip1 = new ToolTip(); 
    toolTip1.IsBalloon = true; 
    toolTip1.InitialDelay = 500; 
    toolTip1.SetToolTip(treeView1, node.Text); 
} 

的问题是ToolTip分配给TreeView,不给TreeNode ,并且气球的位置很奇怪 - 不在预期的鼠标坐标处,而是在treeView1的某处。

我试图使用toolTip1.Show(),但InitialDelay属性被忽略。

如何在TreeNode上放置气球ToolTip并延迟其显示?

回答

5

为了显示TreeNodes的工具提示,不需要ToolTip控件。 TreeView有一个属性ShowNodeToolTips,您可以设置为trueTreeNodes有一个ToolTipText属性。


但是,如果要将ToolTip显示为气球,事情会变得更加复杂。幸运的是TreeView有一个NodeMouseHover事件。与Timer一起,我们可以使ToolTip按预期运行。

在我们的形式,我们做出这些声明并设置定时器事件处理程序

private const int InitialToolTipDelay = 500, MaxToolTipDisplayTime = 2000; 

private ToolTip toolTip = new ToolTip(); 
private Timer timer = new Timer(); 
private TreeNode toolTipNode; 

public frmTreeViewWithToolTip() 
{ 
    InitializeComponent(); 
    toolTip.IsBalloon = true; 
    timer.Tick += new EventHandler(timer_Tick); 
} 

NodeMouseHover我们启动这一进程

private void treeView_NodeMouseHover(object sender, 
            TreeNodeMouseHoverEventArgs e) 
{ 
    timer.Stop(); 
    toolTip.Hide(this); 

    toolTipNode = e.Node; 

    timer.Interval = InitialToolTipDelay; 
    timer.Start(); 
} 

定时器将两次启动:初始延迟一次并且一次用于气球的最大显示时间。因此,我们必须在timer.Tick事件处理程序处理这两种情况

void timer_Tick(object sender, EventArgs e) 
{ 
    timer.Stop(); 
    if (timer.Interval == InitialToolTipDelay) { 
     Point mousePos = treeView.PointToClient(MousePosition); 

     // Show the ToolTip if the mouse is still over the same node. 
     if (toolTipNode.Bounds.Contains(mousePos)) { 
      // Node location in treeView coordinates. 
      Point loc = toolTipNode.Bounds.Location; 

      // Node location in form client coordinates. 
      loc.Offset(treeView.Location); 

      // Make balloon point to upper right corner of the node. 
      loc.Offset(toolTipNode.Bounds.Width - 7, -12); 

      toolTip.Show("Node: " + toolTipNode.Text, this, loc); 

      timer.Interval = MaxToolTipDisplayTime; 
      timer.Start(); 
     } 
    } else { 
     // Maximium ToolTip display time exceeded. 
     toolTip.Hide(this); 
    } 
} 

最后,我们不希望显示ToolTip如果鼠标离开TreeView

private void treeView_MouseLeave(object sender, EventArgs e) 
{ 
    timer.Stop(); 
    toolTip.Hide(this); 
} 
+0

它工作的很好,我还有一个问题是有没有任何机会来定制这个工具提示的外观(像气球一样)。谢谢你的回答。 – santBart 2012-04-06 13:13:24

+0

我的初步答案只有在需要标准工具提示时才有用。我添加并测试了一个解决方案,它创建气球工具提示,以适当的方式延迟它们,并将它们显示在相关“TreeNode”相对方便的位置。 – 2012-04-06 15:39:18

+0

查看“ToolTip”的属性。您可以更改颜色,更改字体,设置标题和图标等等。如果将属性'OwnerDraw'设置为'true',则可以在'ToolTip.Draw'事件处理程序中自行绘制'ToolTip'(仅在IsBalloon == false时起作用)。 – 2012-04-06 15:46:28

0

我认为你需要使用:

toolTip1.Show(“text”,treeView1,point);