Положение всплывающей подсказки (для уведомления об ошибке) - PullRequest
4 голосов
/ 31 августа 2010

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

Короче говоря, я пытался найти быстрый и простой способ уведомлять пользователя об ошибках без использования всплывающих окон.

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

private void ShowTooltipBalloon(string title, string msg)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new EventHandler(delegate { ShowTooltipBalloon(title,msg); }));
    }
    else
    {
        ToolTip tt = new ToolTip();
        tt.IsBalloon = true;
        tt.ToolTipIcon = ToolTipIcon.Warning;
        tt.ShowAlways = true;
        tt.BackColor = Color.FromArgb(0xFF, 0xFF, 0x90);
        tt.ToolTipTitle = title;

        int x = this.Width - lblLeftTarget.Width - lblVersion.Width - toolStripStatusLabel8.Width - 10;
        int y = this.Height - lblLeftConnectImg.Height - 60;
        tt.Show(msg, this, x, y, 5000);
    }
}

Это очень выходит за рамки требований, но мой начальник очень любит детали, поэтому в дополнение к решению этой проблемы я должен решить ее быстро. Мне нужно что-то относительно простое для реализации, которое не «раскачивает лодку» текущего программного обеспечения, которое я близок к выпуску.

При этом, конечно, я выслушаю любой совет, независимо от того, осуществим он или нет. По крайней мере, я мог бы чему-то научиться. alt text

* РЕДАКТИРОВАТЬ: Кажется, мое изображение не отображается. Я не знаю, просто ли это мой компьютер. Ну да ладно ...

1 Ответ

1 голос
/ 13 июля 2014

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

private void ShowTooltipBalloon(string title, string msg)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new EventHandler(delegate { ShowTooltipBalloon(title, msg); }));
    }
    else
    {
        // the designer hooks up to this.components
        // so lets do that as well...
        ToolTip tt = new ToolTip(this.components);

        tt.IsBalloon = true;
        tt.ToolTipIcon = ToolTipIcon.Warning;
        tt.ShowAlways = true;
        tt.BackColor = Color.FromArgb(0xFF, 0xFF, 0x90);
        tt.ToolTipTitle = title;

        // Hookup this tooltip to the statusStrip control
        // but DON'T set a value 
        // because if you do it replicates the problem in your image
        tt.SetToolTip(this.statusStrip1, String.Empty); 

        // calc x
        int x = 0;
        foreach (ToolStripItem tbi in this.statusStrip1.Items)
        {
            // find the toolstrip item
            // that the tooltip needs to point to
            if (tbi == this.toolStripDropDownButton1)  
            {
                break;
            }
            x = x + tbi.Size.Width;
        }

        // guestimate y 
        int y = -this.statusStrip1.Size.Height - 50;
        // show it using the statusStrip control 
        // as owner
        tt.Show(msg, this.statusStrip1, x, y, 5000);
    }
}
...