2011-02-10 3 views
0

표시되는 컨트롤이 필요합니다. 경우 tooltip2 위에 tooltip1하고 다른 하나 개의 디스플레이 가리키면 때하나의 컨트롤에 여러 개의 밑줄이 그어진 툴팁 - WinForms

Tooltip1 Tooltip2

^   ^
TOOLTIPA  TOOLTIPB 

notooltip 한 도움말 화면을 가지고. 실제로는 밑줄이 그어져 파란색으로 표시됩니다.

RichTextbox로이를 수행하고 GetPositionFromCharIndex 및 마우스 이벤트로 툴팁의 위치를 ​​추적 할 수 있습니다. 그러나 richtextbox를 사용하면 컨트롤을 비활성화하지 않고 텍스트 선택/위치 캐럿을 비활성화 할 수 없으므로 모든 이벤트가 비활성화됩니다.

문자 간격을 처리하기 때문에 레이블을 수동으로 간격을 두어야하기 때문에 여러 개의 레이블을 사용하고 싶지 않습니다.

이 문제를 해결할 수있는 Dev Express와 같은 타사 컨트롤이 있습니까? 어떤 대안?

감사

+0

만족스러운 결과를 얻었습니까? 소유자가 색상 표를 그려주는 사용자 정의 컨트롤을 만들고 있습니다. 각 색상 위에 다른 툴팁을 표시하는 것이 좋습니다. Tooltip.Show()를 호출 할 수는 있지만 일단 숨기면 마우스가 닫히고 다시 제어 할 때까지 다시 표시되지 않습니다. –

+0

나는 그것을 끝내고있다. TextRenderer를 사용하여 원하는 문자열을 그리고 다른 툴팁 위치를 추적했습니다. 그것은 당신의 사용을 위해 그것을 수정하는 것은 나쁘지 않아야합니다. 코드를 공유하는 좋은 방법은 무엇입니까? – TrevDev

답변

1

설명에서 구한 내용을 100 % 확신 할 수는 없지만 캡션이 마우스로 가리키고있는 컨트롤 부분에 따라 도구 설명이있는 컨트롤 하나가 필요하다고 생각하십니까?

나는 이것을 "좋은"방법으로 생각할 수 없다. 아래의 코드는 Label에서 작동하지만 추악합니다. 나는 개인적으로 여러 개의 레이블이있는 UserControl을 만들고 수동으로 간격을 두지 않을까 걱정합니다. 하지만 여기에 내가 가지고있는 게있어 :

 Label lbl = new Label() { Left = 6, Top = 6, AutoSize = true }; 
     this.Controls.Add(lbl); 

     // Determine the width of each of the "sections" of the Label Text. 
     // Use the fact that AutoSize = true will increase the Width of the 
     // Label as you increase the Text Length. 
     int width = lbl.Width; 
     lbl.Width = 0; 
     lbl.Text = string.Empty; 
     lbl.Text = "x"; 
     int delta = lbl.Width; 
     lbl.Text += "x"; 
     delta = lbl.Width - 2 * (lbl.Width - delta); 
     lbl.Text = "ToolTip1"; 
     int txt1Width = lbl.Width - delta; 
     delta = lbl.Width; 
     lbl.Text += " NoToolTip "; 
     int txt2Width = lbl.Width - delta; 
     delta = lbl.Width; 
     lbl.Text += "ToolTip2"; 
     int txt3Width = lbl.Width - delta; 

     // Use a System.Windows.Forms.ToolTip and set the caption on 
     // MouseHover, depending on the Position of the Cursor. 
     var tip = new ToolTip(); 
     lbl.MouseHover += delegate(object sender, EventArgs e) 
     { 
      tip.RemoveAll(); 

      // Find the Point for the ToolTip (relative to the Label) based 
      // on the Position of the Cursor. 
      this.Cursor = new Cursor(Cursor.Current.Handle); 
      Point lblScreenPos = lbl.PointToScreen(Point.Empty); 
      Point tipPoint = new Point(Cursor.Position.X, Cursor.Position.Y + lbl.Height); 
      tipPoint = new Point(tipPoint.X - lblScreenPos.X, tipPoint.Y - lblScreenPos.Y); 

      // Determine the location of the "sections" of Label text. 
      int x = tipPoint.X; 
      int txt1Left = 3; 
      int txt1Right = txt1Left + txt1Width; 
      int txt3Left = txt1Right + txt2Width; 
      int txt3Right = txt3Left + txt3Width; 

      // Show the ToolTip with the correct caption. 
      if (x >= txt1Left && x <= txt1Right) 
      { 
       tip.Show("TOOLTIPA", lbl, tipPoint, tip.AutoPopDelay); 
      } 
      else if (x >= txt3Left && x <= txt3Right) 
      { 
       tip.Show("TOOLTIPB", lbl, tipPoint, tip.AutoPopDelay); 
      } 
     }; 
     lbl.MouseLeave += delegate(object sender, EventArgs e) { tip.RemoveAll(); }; 

툴팁에는 밑줄이없고 시스템 기본 글꼴이 자동으로 사용됩니다. 소유자가 도구 설명을 그릴 때만 재정의 할 수 있습니다. 파란색으로 표시하고 밑줄을 긋아야하는 경우 OwnerDraw 속성을 확인하십시오.

+0

이것은 내가 richtextbox로하고있는 것에 가깝다. 그러나 실제로 도구가 표시 될 곳의 레이블 텍스트에 밑줄을 긋기 위해 찾고 있습니다. 같은 종류의 링크. 그래서 풍부한 텍스트 상자를 사용하여 글꼴을 부분적으로 변경할 수있었습니다. 그렇다면 캐럿 위치와 선택 가능한 텍스트가 붙어 있습니다. – TrevDev

+0

2 개의 LinkLabels과 1 개의 Label을 사용하십시오. 코드와 함께 올바른 위치에 양식에 배치하십시오. 내 Label 텍스트의 "섹션"너비를 가져 오는 코드와 비슷한 코드가있는 컨트롤을 배치 할 위치를 결정합니다.Control의 왼쪽 가장자리와 그려진 Text (3 픽셀 임) 사이의 거리, Control의 오른쪽 가장자리와 그려진 Text (Control Width - Text width - 3) 사이의 거리, . 이 세 가지 값을 사용하여 다음 컨트롤을 배치 할 위치를 결정하여 그려진 텍스트가 마지막 컨트롤의 텍스트 바로 뒤에 하나의 공백이되게합니다. –

+0

나는 이것을 시도했거나 적어도 모든 텍스트가있는 레이블을 양식에 넣은 다음 여러 레이블을 수동으로 정렬하여 해당 위치가 이전 레이블의 위치/너비와 관련이 있는지 확인했습니다. 값은 문자 간격 논리로 인해 매번 변경됩니다. 때로는 6 픽셀이 될 것이고 다른 때는 4가 될 것입니다. (참고 : 모든 레이블에서 패딩을 해제했습니다.) – TrevDev

0

인가이 필요하시면 :

ToolTip toolTip = new ToolTip(); 
toolTip.SetToolTip(control1, "Hello "); 
toolTip.SetToolTip(control2, "world!"); 

... 또는 내가 완전히 여기에 보트를 놓친 거지? 설명에서 문제가 무엇인지 이해하는 것은 약간 어렵습니다.

+0

나는 그것을 설명하는 좋은 방법을 모르지만 기본적으로 첫 단어 위에 마우스를 가져 가면 하나의 툴팁이 표시되고 세 번째 단어 위로 마우스를 올리면 다른 툴팁이 표시되는 세 단어를 보여주는 컨트롤을 알 수 있습니다. 나는 또한 단어 1과 3에 밑줄이 그어지기를 원하지만, 단어 2에 툴팁이나 밑줄이 없다 ... – TrevDev

관련 문제