2011-02-10 2 views
0

Мне нужен элемент управления, который показывает.Несколько подчёркнутых подсказок на одном элементе управления - WinForms

Tooltip1 notooltip Tooltip2

^   ^
TOOLTIPA  TOOLTIPB 

Чтобы иметь один дисплей подсказки при наведении tooltip1 и другого одного дисплея, когда над tooltip2. На самом деле это было бы подчеркнуто и синим.

Я могу выполнить это с помощью richtextbox и отслеживать местоположение подсказок с помощью GetPositionFromCharIndex и событий мыши. Тем не менее, с richtextbox я не могу отключить выделение/позиционирование текста без отключения элемента управления, что, в свою очередь, отключает все мои события.

Я не хочу использовать несколько меток, потому что это требует ручного разделения меток из-за обработки интервала между символами.

Есть ли сторонний контроль, такой как Dev Express, который может справиться с этим? Любые альтернативы?

Благодаря

+0

Вы получили эту работу для вашего удовлетворения? Я создаю пользовательский элемент управления, который владелец рисует цветовой палитрой. Было бы неплохо показать другую подсказку над каждым цветом. Я могу вызвать Tooltip.Show(), но как только он скроется сам, он не появится снова, пока мышь не уйдет и не вступит в мой контроль. –

+0

Я заканчиваю его. Я закончил тем, что использовал TextRenderer для рисования нужной строки и отслеживания различных мест подсказок. Не следует плохо изменять его для вашего использования. Что было бы хорошим способом обмена кодом? – TrevDev

ответ

1

Я не уверен на 100%, что вы просите от вашего описания, но кажется, что вы хотите, чтобы один элемент управления имел подсказку, надпись которого зависит от того, какая часть элемента управления находится над мышью?

Я не могу придумать «хороший» способ сделать это. Код ниже будет работать для ярлыка, но он уродлив. Я лично предпочел бы создать 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. Поместите их в форму в правильном месте с кодом. Определите, где разместить элементы управления с кодом, подобным моему, который получает ширину «разделов» текста моей метки.Найдите ширину одного пробела, расстояние между левым краем элемента управления и нарисованным текстом (это 3 пикселя), а расстояние между правым краем элемента управления и нарисованным текстом (ширина управления - ширина текста - 3) , Используйте эти 3 значения, чтобы определить, где разместить следующий элемент управления, чтобы нарисованный текст был ровно на одно место после последнего элемента управления. –

+0

Я попробовал это или, по крайней мере, поместил ярлык со всем текстом в форме, а затем вручную выстроил несколько ярлыков, чтобы увидеть, где их местоположение было относительно местоположения/ширины предыдущего ярлыка. Значение менялось каждый раз из-за логики интервала символов, которую я предполагаю. Иногда это было бы 6 пикселей, иногда это было бы 4. (Примечание. Я отключил прописку на всех моих ярлыках. – TrevDev

0

Это то, что вы после:

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

... или я упускаю полностью здесь? Трудно понять, в чем проблема из вашего описания.

+0

Я не знаю, как это описать, но в основном элемент управления, который показывает три слова, где наведение над первым словом отображает одну всплывающую подсказку, а зависание над третьим словом будет отображать другую подсказку. Я также хочу, чтобы слово 1 и 3 было подчеркнуто, но нет подсказки или подчеркивания слова 2 ... – TrevDev

Смежные вопросы