Как увеличить размер всплывающей подсказки - PullRequest
0 голосов
/ 12 декабря 2018

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

Моя проблема заключается в высоте прямоугольника.

Snip:

enter image description here

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

Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Discounting.Module
{
    public partial class Benefits : UserControl
    {
        public Benefits()
        {
            InitializeComponent();
        }

        private void ToolTip1_Draw(object sender, DrawToolTipEventArgs e)
        {
            var newEventArgs = new DrawToolTipEventArgs(
                e.Graphics,
                e.AssociatedWindow,
                e.AssociatedControl,
                e.Bounds, e.ToolTipText,
                this.BackColor,
                this.ForeColor,
                Font);

            DrawToolTip(e);
        }

        private void DrawToolTip(DrawToolTipEventArgs e)
        {
            using (var sf = new StringFormat())
            {
                sf.LineAlignment = StringAlignment.Center;

                sf.Alignment = StringAlignment.Center;


                using (var graphics = e.Graphics)
                {

                    var linearGradientBrush = new LinearGradientBrush(new Rectangle(e.Bounds.X, e.Bounds.Y,
                        8000, 1000), Color.GreenYellow, Color.MintCream, 45f);

                    graphics.FillRectangle(linearGradientBrush, linearGradientBrush.Rectangle);

                    graphics.DrawString(e.ToolTipText, new Font("Aerial",12.0f, FontStyle.Bold), Brushes.Silver,
                        new PointF(linearGradientBrush.Rectangle.X + 6, linearGradientBrush.Rectangle.Y + 6)); // shadow layer
                    graphics.DrawString(e.ToolTipText, new Font("Aerial",12.0f, FontStyle.Bold), Brushes.Black,
                        new PointF(linearGradientBrush.Rectangle.X + 5, linearGradientBrush.Rectangle.Y + 5)); // top layer

                    linearGradientBrush.Dispose();
                }
            }
        }

        private void ToolTip2_Draw(object sender, DrawToolTipEventArgs e)
        {
            DrawToolTip(e);
        }

        private void ToolTip3_Draw(object sender, DrawToolTipEventArgs e)
        {
            DrawToolTip(e);
        }

        private void ToolTip4_Draw(object sender, DrawToolTipEventArgs e)
        {
            DrawToolTip(e);
        }
    }
}

Если вам потребуются дополнительные сведения, я был бы рад предоставить их.

1 Ответ

0 голосов
/ 12 декабря 2018

Ну, поскольку при смешивании TextRenderer и объекта Graphics могут быть некоторые причуды, вот пример:

The *Событие 1010 * ToolTip.PopUp предоставляет средства для установки размера прямоугольника всплывающей подсказки.Вам просто нужно измерить текст и установить его PopupEventArgs.ToolTipSize на измеренный размер.
Это также позволяет использовать многострочные строки, используя Environment.NewLine дляразделите линии.

Объект PopupEventArgs не предоставляет объект Graphics, который можно использовать для измерения текста.Вместо этого мы можем использовать TextRenderer.MeasureText .

TextRenderer.MeasureText очень точный: он вернет точную меру текста.Поскольку вы используете Graphics.DrawString для рисования текста, нам лучше быть щедрым и добавить больше места к измеренной ширине, чтобы избежать переноса текста, а также потому, что текст выглядит лучше, если прямоугольник контейнера не слишкомтуго.
В событии Popup после измерения текста я добавляю 10 пикселей к ширине.При необходимости измените

Примечание :
Здесь семейство Font и размер жестко закодированы.Конечно, вы можете использовать более динамический объект Font, возможно связанный со свойством UserControl.Шрифт может быть изменен в любое время: событие PopUp будет использовать его для измерения границ теста.

ToolTip Custom Drawing

private void toolTip1_Popup(object sender, PopupEventArgs e)
{
    ToolTip tt = (sender as ToolTip);
    string ToolTipText = tt.GetToolTip(e.AssociatedControl);
    TextFormatFlags flags = TextFormatFlags.LeftAndRightPadding | TextFormatFlags.NoClipping |
                            TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter;
    using (Font font = new Font("Arial", 12.0f, FontStyle.Bold))
    {
        e.ToolTipSize = TextRenderer.MeasureText(ToolTipText, font, Size.Empty, flags);
        e.ToolTipSize = new Size(e.ToolTipSize.Width + 10, e.ToolTipSize.Height);
    }
}

private void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
    DrawToolTip(e);
}

private void DrawToolTip(DrawToolTipEventArgs e)
{
    e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
    using (var sf = new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.NoWrap))
    {
        sf.LineAlignment = StringAlignment.Center;
        sf.Alignment = StringAlignment.Center;
        Rectangle ShadowBounds = new Rectangle(new Point(e.Bounds.X + 1, e.Bounds.Y + 1), e.Bounds.Size);
        using (var linearGradientBrush = new LinearGradientBrush(e.Bounds, Color.GreenYellow, Color.MintCream, 45f))
        using (Font font = new Font("Arial", 12.0f, FontStyle.Bold))
        {
            e.Graphics.FillRectangle(linearGradientBrush, e.Bounds);
            e.Graphics.DrawString(e.ToolTipText, font, Brushes.LightGray, ShadowBounds, sf);
            e.Graphics.DrawString(e.ToolTipText, font, Brushes.Black, e.Bounds, sf);
        }
    }
}
...