Как предотвратить всплывающую подсказку в пользовательском элементе управления? - PullRequest
6 голосов
/ 08 января 2012

Я создал пользовательский элемент управления, и когда условие выполнено, я хочу показать подсказку:

protected override void OnMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);

    var plannedItem = GetPlannedItemByPosition(e.Location);

    if (plannedItem != null)
        _tooltip.SetToolTip(this, plannedItem.Description);
    else
        _tooltip.RemoveAll();
}

Этот код работает нормально, за исключением лица, на котором всплывает подсказка.

Этот пользовательский элемент управления отображает всю информацию в событии OnPaint, может быть, это как-то связано с этим? И если да, как я могу предотвратить всплывающую подсказку?

Ответы [ 5 ]

7 голосов
/ 28 марта 2014

Запоминание последней позиции мыши и установка всплывающей подсказки только при изменении позиции мыши.

public partial class Form1 : Form
{
    private int lastX;
    private int lastY;

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.X != this.lastX || e.Y != this.lastY)
        {
            toolTip1.SetToolTip(button1, "test");

            this.lastX = e.X;
            this.lastY = e.Y;
        }

    }
6 голосов
/ 08 января 2012

Это произойдет, когда вы отобразите подсказку в позиции курсора мыши. Как только появляется окно подсказки, Windows замечает, что мышь находится в этом окне, и отправляет сообщение MouseMove. Что заставляет всплывающую подсказку исчезнуть. Что заставляет Windows отправлять сообщение MouseMove вашему элементу управления, используя метод OnMouseMove (). Что заставляет всплывающую подсказку появляться снова. И так далее, вы увидите, что всплывающая подсказка быстро мигает.

Решите это одним из следующих способов:

  • показывает всплывающую подсказку вдали от позиции мыши, чтобы она не перекрывала курсор мыши
  • обновлять / показывать всплывающую подсказку только тогда, когда ее нужно изменить
  • установите для свойства элемента управления Capture значение true, чтобы всплывающая подсказка не получала сообщение MouseMove
1 голос
/ 08 января 2012

Поскольку это нарисованный пользовательский элемент управления, я думаю, что было бы проще просто иметь переменную, содержащую последний показанный совет, и вместо того, чтобы всегда "устанавливать" подсказку, просто показать ее.

Простой пример (используя только форму):

public partial class Form1 : Form {
  private List<TipRect> _Tips = new List<TipRect>();
  private TipRect _LastTip;
  private ToolTip _tooltip = new ToolTip();

  public Form1() {
    InitializeComponent();
    _Tips.Add(new TipRect(new Rectangle(32, 32, 32, 32), "Tip #1"));
    _Tips.Add(new TipRect(new Rectangle(100, 100, 32, 32), "Tip #2"));
  }

  private void Form1_Paint(object sender, PaintEventArgs e) {
    foreach (TipRect tr in _Tips)
      e.Graphics.FillRectangle(Brushes.Red, tr.Rect);
  }

  private void Form1_MouseMove(object sender, MouseEventArgs e) {
    TipRect checkTip = GetTip(e.Location);
    if (checkTip == null) {
      _LastTip = null;
      _tooltip.Hide(this);
    } else {
      if (checkTip != _LastTip) {
        _LastTip = checkTip;
        _tooltip.Show(checkTip.Text, this, e.Location.X + 10, e.Location.Y + 10, 1000);
      }
    }
  }

  private TipRect GetTip(Point p) {
    TipRect value = null;
    foreach (TipRect tr in _Tips) {
      if (tr.Rect.Contains(p))
        value = tr;
    }
    return value;
  }
}

Вот класс TipRect, который я создал для имитации того, чем является ваш класс PlannedItem:

public class TipRect {
  public Rectangle Rect;
  public string Text;

  public TipRect(Rectangle r, string text) {
    Rect = r;
    Text = text;
  }
}
0 голосов
/ 02 августа 2017

Для посетителей этой темы, вот что я сделал, следуя советам выше (VB.NET):

Dim LastToolTip As String
Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    Dim NewToolTip = CalculateTooltipText(e.X, e.Y)
    If LastToolTip <> NewToolTip Then
        ToolTip1.SetToolTip(PictureBox1, NewToolTip)
        LastToolTip = NewToolTip
    End If
End Sub

Мигание прекратилось.

0 голосов
/ 08 января 2012

Я полагаю, ваша мышь немного двигается, когда вы думаете, что она неподвижна.Я предлагаю вам выполнить какое-то кеширование здесь - вызывайте _tooltip.SetToolTip, только если запланированный элемент изменился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...