如何增加工具提示矩形大小

时间:2018-12-12 13:03:49

标签: winforms tooltip

我当前正在实现一个工具提示,其中至少包含两个句子,因此我需要以某种方式创建一个大矩形来容纳它。

我的问题是矩形的高度。

截图:

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 :(得分:2)

好吧,由于在混合 TextRenderer Graphics 对象时可能会有一些怪癖,下面是一个示例:
< / p>

ToolTip.PopUp事件提供了设置ToolTip矩形大小的方法。您只需要测量文本并将其PopupEventArgs.ToolTipSize属性设置为测量的大小即可。
这样也可以使用多行字符串,并使用Environment.NewLine分隔行。

PopupEventArgs对象没有提供可用于测量文本的Graphics对象。我们可以改用TextRenderer.MeasureText

TextRenderer.MeasureText非常精确:它将返回文本的精确尺寸。由于您使用的是 Graphics.DrawString 来绘制文本,因此我们最好慷慨大方,并为测量的宽度添加更多空间,以避免文本换行,并且因为如果容器为矩形,文本看起来会更好不太紧。
在Popup事件中,在测量Text之后,我将10像素添加到Width中。根据需要进行修改

注意
在这里,字体系列和大小是硬编码的。当然,您可能想使用更具动态性的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);
        }
    }
}