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

C# 如何增加工具提示矩形的大小,c#,.net,winforms,graphics,tooltip,C#,.net,Winforms,Graphics,Tooltip,我目前正在实现一个工具提示,其中至少有两句话值得一读,所以我需要创建一个大矩形来容纳它 我的问题是矩形的高度 剪断: 如您所见,绿色矩形没有所需的大小 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Drawing.Drawing2D; using System.Linq;

我目前正在实现一个工具提示,其中至少有两句话值得一读,所以我需要创建一个大矩形来容纳它

我的问题是矩形的高度

剪断:

如您所见,绿色矩形没有所需的大小

代码:

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);
        }
    }
}

如果您需要更多详细信息,我很乐意提供。

好吧,因为在混合
文本渲染器
图形
对象时可能会有一些怪癖,下面是一个示例:

事件提供了设置工具提示矩形大小的方法。您只需测量文本并将其属性设置为测量的大小。
这也允许使用多行字符串,使用分隔行。

该对象不提供可用于测量文本的
图形
对象。我们可以用它来代替

TextRenderer.MeasureText
非常精确:它将返回文本的精确测量值。由于您使用的是
Graphics.DrawString
来绘制文本,因此我们最好慷慨一些,在测量的宽度上增加一些空间,以避免文本换行,而且如果容器矩形不太紧,文本看起来会更好。
在弹出事件中,在测量文本后,我将向宽度和高度添加5个像素
(Size.Add([Measured Size],new Size(5,5))
)。根据需要修改

注意
这里,字体系列和大小是硬编码的。当然,您可能希望使用更动态的字体对象,可能链接到
UserControl
的属性。字体可以随时更改:
弹出窗口
事件将使用它来测量测试边界

TextFormatFlags toolTipFlags = TextFormatFlags.VerticalCenter | 
    TextFormatFlags.LeftAndRightPadding | TextFormatFlags.HorizontalCenter | TextFormatFlags.NoClipping;
Font toolTipFont = new Font("Arial", 12.0f, FontStyle.Bold);

private void toolTip1_Popup(object sender, PopupEventArgs e)
{
    string toolTipText = (sender as ToolTip).GetToolTip(e.AssociatedControl);
    using (var g = e.AssociatedControl.CreateGraphics()) {
        var textSize = Size.Add(TextRenderer.MeasureText(
            g, toolTipText, toolTipFont, Size.Empty, flags), new Size(10, 5));
        e.ToolTipSize = textSize;
    }
}

private void toolTip1_Draw(object sender, DrawToolTipEventArgs e) => DrawToolTip(e);

private void DrawToolTip(DrawToolTipEventArgs e)
{
    using (var linearGradientBrush = new LinearGradientBrush(e.Bounds, Color.GreenYellow, Color.MintCream, 45f)) {
        e.Graphics.FillRectangle(linearGradientBrush, e.Bounds);
    }

    var shadowBounds = new Rectangle(new Point(e.Bounds.X + 1, e.Bounds.Y + 1), e.Bounds.Size);

    TextRenderer.DrawText(e.Graphics, e.ToolTipText, toolTipFont, shadowBounds, Color.LightGray, toolTipFlags);
    TextRenderer.DrawText(e.Graphics, e.ToolTipText, toolTipFont, e.Bounds, Color.Black, toolTipFlags);
}