2013-12-03 11 views
1

C#의 LinkLabel 컨트롤의 LinkArea 내에 마우스가 있는지 확인하는 방법이 있습니까?C#의 LabelLink LinkArea 감지

도움을 주시면 감사하겠습니다.

+0

마우스를 가져 가면됩니까? –

+1

이 winform, asp.net, wpf입니까? –

+0

winform 및 – williamtroup

답변

1

당신이이 Mouse Enter Event

linkLabel1.MouseEnter += new EventHandler(linkLabel1_MouseEnter); 

private void linkLabel1_MouseEnter(object sender, EventArgs e) 
{ 
    MessageBox.Show("Mouse is within link area"); 
} 
+0

이상의 마우스를 사용하면 마우스를 가리킬 수 있습니까? –

+0

@SudhakarTillapudi 내가 아는 한. 마우스 입력과는 다른 효과가 있습니다. 마우스를 올리면 나타납니다. 마우스는 몇 초 동안 컨트롤 위에 있어야하지만 마우스 입력은 즉시 –

+0

입니다. 올바르지 않습니다. 이것은 마우스가 컨트롤 경계 내에 있는지 여부를 알려주지 만 실제 링크 자체에 있는지 여부는 알 수 없습니다. 예를 들어, 큰 컨테이너의 상단이나 하단에'LinkLabel' 컨트롤을 도킹하고 왼쪽이나 오른쪽으로 정렬하면 컨트롤이 전체 컨테이너 너비를 커버하지만 그 안의 링크는 포함되지 않습니다. 마우스 커서를 텍스트 이외의 컨트롤의 빈 영역으로 이동하면 'MouseEnter' 이벤트가 계속 실행됩니다. –

0

을 할 수 없습니다를 사용할 수 있습니다. 이 글을 쓰는 시점에 the other answer에 제안 된 MouseEnter 이벤트는 실제로 링크 텍스트 위에 있는지 여부에 관계없이 마우스가 제어 영역으로 들어갈 때마다 실행됩니다.

LinkLabel 컨트롤의 경계가 내용에 비해 작 으면 MouseEnter 이벤트가 제대로 작동 할 수 있습니다. 그러나 마우스가 링크 텍스트 위에 놓여 있고 텍스트 주위의 많은 영역이 컨트롤 주위에있는 경우 (예를 들어) 링크를 색 변경하려는 경우이 방법은 작동하지 않습니다.

다소 관련이없는 메모에서 LinkLabel의 링크가 여러 개있는 경우 현재과 같이 검색 할 수 없습니다.

누군가가 궁금해하는 경우에 대한 자세한 내용 : LinkLabel.LinkArea 속성도 찾고자하는 것이 아닙니다. 그것은 단지 LinkLabel 내의 어떤 문자가 실제로 링크의 일부인지를 결정하고 화면상에서 차지하는 실제 영역을 결정하지 않습니다.

끝내려면 찾고있는 기능을 얻을 수있는 유일한 방법은 Label 또는 LinkLabel 컨트롤과 유사하게 동작하는 나만의 맞춤 컨트롤을 구현하는 것입니다. 필요한 것.

당신의 LinkLabelEx 예에 이벤트 핸들러를 추가

using System; 
using System.Windows.Forms; 

namespace MyControlNameSpace 
{ 
    /// <summary> 
    /// Data for a HoveredLinkChanged-Handler. 
    /// </summary> 
    public class HoveredLinkChangedEventArgs : EventArgs 
    { 
     private readonly LinkLabel.Link m_Link; 

     /// <summary> 
     /// Creates data for a HoveredLinkChanged-Handler 
     /// </summary> 
     /// <param name="link">the Link, with the mouse pointer over it</param> 
     public HoveredLinkChangedEventArgs(LinkLabel.Link link) 
     { 
      m_Link = link; 
     } 

     /// <summary> 
     /// Returns the hovered Link 
     /// </summary> 
     public LinkLabel.Link HoveredLink 
     { 
      get { return m_Link; } 
     } 
    } 

    /// <summary> 
    /// The structure of a HoveredLinkChanged-Handler 
    /// </summary> 
    public delegate void HoveredLinkChangedEventHandler(
       object sender, HoveredLinkChangedEventArgs e); 

    /// <summary> 
    /// Adds to LinkLabel the possiblity to react on changes 
    /// of the hovered Link (e.g. to alter a TooltipText). 
    /// </summary> 
    public class LinkLabelEx : LinkLabel 
    { 
     private Link m_HoveredLink; 

     /// <summary> 
     /// Occurs, when another Link is hovered. 
     /// </summary> 
     public event HoveredLinkChangedEventHandler HoveredLinkChanged; 

     /// <summary> 
     /// Raises the HoveredLinkChanged event 
     /// </summary> 
     /// <param name="hoveredLink">the hovered Link</param> 
     protected virtual void OnHoveredLinkChanged(Link hoveredLink) 
     { 
      if (HoveredLinkChanged != null) 
       HoveredLinkChanged(this, 
        new HoveredLinkChangedEventArgs(hoveredLink)); 
     } 

     /// <summary> 
     /// Raises the Control.OnMouseMove(MouseEventArgs) event. 
     /// </summary> 
     /// <param name="e">a MouseEventArgs containing the event data</param> 
     protected override void OnMouseMove(MouseEventArgs e) 
     { 
      base.OnMouseMove(e); 
      Link currentLink = PointInLink(e.X, e.Y); 
      if (Equals(currentLink, m_HoveredLink)) return; 
      m_HoveredLink = currentLink; 
      OnHoveredLinkChanged(m_HoveredLink); 
     } 
    } 
} 

는 다음 두 가지가해야 할이 남아 있습니다 : 원본에 LinkLabel이 보호 기능 PointInLink을 가지고 있기 때문에

0

이 수행하기 어려운되지 않습니다 :

linkLabelEx1.HoveredLinkChanged += linkLabelEx1_HoveredLinkChanged; 

ToolTipText입니다있는 EventArgs에 주어진 링크, 예에 따라 설정 :

void linkLabelEx1_HoveredLinkChanged(object sender, HoveredLinkChangedEventArgs e) 
{ 
    string ttt = e.Link == null 
     ? string.Empty 
     : e.Link.Description; 
    toolTip1.SetToolTip((Control)sender, ttt); 
}