简体   繁体   English

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

[英]How to increase ToolTip Rectangle size

I am currently implementing a tooltip which has at least two sentences worth inside of it, so I need to somehow create a large rectangle which would hold it.我目前正在实现一个工具提示,其中至少包含两个句子,所以我需要以某种方式创建一个大矩形来容纳它。

My issue is the height of the rectangle.我的问题是矩形的高度。

Snip:剪辑:

在此处输入图像描述

As you can see the green rectangle does not have the required size.如您所见,绿色矩形没有所需的大小。

Code:代码:

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

If you require further details I would be happy to provide them.如果您需要更多详细信息,我很乐意提供。

Well, since there might be some quirks when mixing TextRenderer and the Graphics object, here's an example:好吧,因为在混合TextRendererGraphics对象时可能会有一些怪癖,下面是一个示例:

The ToolTip.PopUp event provides means to set the Size of the ToolTip rectangle. ToolTip.PopUp事件提供了设置工具提示矩形大小的方法。 You just need to measure the Text and set its PopupEventArgs.ToolTipSize property to the measured Size.您只需测量文本并将其PopupEventArgs.ToolTipSize属性设置为测量的大小。
This allows to use multi-line strings as well, using Environment.NewLine to separate the lines.这也允许使用多行字符串,使用Environment.NewLine来分隔行。

The PopupEventArgs object doesn't provide a Graphics object that can be use to measure the Text. PopupEventArgs对象不提供可用于测量文本的Graphics对象。 We can use TextRenderer.MeasureText instead.我们可以改用TextRenderer.MeasureText

TextRenderer.MeasureText is very precise: it will give back the exact measure of the Text. TextRenderer.MeasureText非常精确:它将返回文本的精确度量。 Since you are using Graphics.DrawString to draw the Text, we better be generous and add some more space to the measured Width, to avoid text wrapping and also because the Text looks better if the container rectangle is not too tight.由于您正在使用Graphics.DrawString绘制文本,我们最好大方一些,并为测量的宽度添加更多空间,以避免文本换行,并且如果容器矩形不是太紧,文本看起来会更好。
In the Popup event, after measuring the Text, I'm adding 5 pixels to both the Width and Height (Size.Add([Measured Size], new Size(5, 5)) ).在 Popup 事件中,在测量文本后,我将 5 个像素添加到宽度和高度(Size.Add([Measured Size], new Size(5, 5)) )。 Modify as required按要求修改

Note :注意
Here, the Font family and Size are hard-coded.在这里,字体系列和大小是硬编码的。 Of course you may want to use a more dynamic Font object, possibly linked to a property of your UserControl .当然,您可能希望使用更动态的 Font 对象,可能链接到您的UserControl的属性。 The Font can be changed at any time: the PopUp event will use it to measure the test bounds. Font 可以随时更改: PopUp事件将使用它来测量测试边界。

工具提示自定义绘图

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM