2017-01-23 51 views
0

이 내 TreeView에있을 때 ToolTip이 표시되어야합니다. 그리고 마우스가 TreeNode을 떠나면 ToolTip이 사라집니다. 나는 MousePosition이 변경되지 않은 한 MousePositionPontToClient()이고 Show()ToolTip이되도록 노력했다. 그것은 작동하지만 잘 보이지 않습니다. ToolTip이 사라지거나 마우스가 조금만 움직 였다면 나타나지 않습니다. C# TreeNode가 표시 될 때 TreeNode를 표시합니다.

이 다소 작업 결과
private void treeView_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 
    ToolTip tip = new ToolTip(); 
    tip.ToolTipTitle = e.Node.Name; 
    Point client = PointToClient(MousePosition); 
    while (client == PointToClient(MousePosition)) 
    { 
     tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 
    } 
    tip.Dispose(); 
} 

대신 내가만큼 MousePosition에서 TreeNode가 이벤트를 트리거 한 TreeNode과 동일로 ToolTip을 보여주기 위해 노력하고있어했다. 하지만 이제는 ToolTip가 표시되지 않습니까?

private void treeView_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 
    ToolTip tip = new ToolTip(); 
    tip.ToolTipTitle = e.Node.Name; 
    while (e.Node == treeView.GetNodeAt(MousePosition)) 
    { 
     tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 
    } 
    tip.Dispose(); 
} 

UPDATE는

난 그냥 예외를 다음에이 결과 실현? 당신이 그것에서 재산 Name에 액세스 할 수 있도록

treeView.GetNodeAt(MousePosition).Name 

개체 참조가 개체

답변

1

treeView.GetNodeAt(MousePosition) 반환 null의 인스턴스로 설정되지 않았습니다.

MousePosition은 마우스 포인터의 위치를 ​​사용자의 컨트롤이 아닌 화면에 표시합니다. 예를 들어 첫 번째 노드는 x : 20이고 Y는 50입니다. 좌표는 x : 1000, y : 500입니다. 그러나 GetNodeAt()은 트리 뷰에서 좌표를 예상합니다. 좌표.

당신은 당신의 트 리뷰, 이런 일을 기준으로 그 좌표를 변환 할 수 있습니다

var point = treeView.PointToClient(MousePosition); 
var node = treeView.GetNodeAt(point); 

UPDATE : 두 번째 예에서 는, 올바른 사용은 다음과 같습니다

private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 
    ToolTip tip = new ToolTip(); 
    tip.ToolTipTitle = e.Node.Name; 
    while (e.Node == treeView.GetNodeAt(treeView.PointToClient(MousePosition))) 
    { 
     tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 
    } 
    tip.Dispose(); 
} 

그러나 사물을 단순화하기 위해 (그리고 깜박임, 툴팁 등의 지속적인 초기화를 피하기 위해), 나는 툴팁 선언을 메소드 밖으로 옮겨서 폼의 스코프에 넣고, 툴팁을 가리킨 다음 마우스 이동시 숨 깁니다. 좋아요 :

ToolTip tip = new ToolTip(); 

private void treeView_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e) 
{ 

    tip.ToolTipTitle = e.Node.Name; 
    tip.Show(e.Node.Nodes.Count.ToString(), this, PointToClient(MousePosition)); 

} 

private void treeView_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (treeView.GetNodeAt(treeView.PointToClient(MousePosition)) == null) 
     tip.Hide(this); 
}