如何增加ToolTip矩形大小 [英] How to increase ToolTip Rectangle size

查看:147
本文介绍了如何增加ToolTip矩形大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.

推荐答案

好吧,因为混合 TextRenderer Graphics 对象时可能会有一些怪癖,这是一个示例:

Well, since there might be some quirks when mixing TextRenderer and the Graphics object, here's an example:

环境. NewLine 分隔行.

The ToolTip.PopUp event provides means to set the Size of the ToolTip rectangle. You just need to measure the Text and set its PopupEventArgs.ToolTipSize property to the measured Size.
This allows to use multi-line strings as well, using Environment.NewLine to separate the lines.

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

The PopupEventArgs object doesn't provide a Graphics object that can be use to measure the Text. We can use TextRenderer.MeasureText instead.

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

TextRenderer.MeasureText is very precise: it will give back the exact measure of the Text. 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.
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))). Modify as required

注意:
在这里,字体系列和大小是硬编码的.当然,您可能想使用更具动态性的Font对象,该对象可能链接到UserControl的属性.字体可以随时更改:PopUp事件将使用它来测量测试范围.

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. The Font can be changed at any time: the PopUp event will use it to measure the test bounds.

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))
    {
        Size textSize = TextRenderer.MeasureText(toolTipText, font, Size.Empty, flags);
        e.ToolTipSize = Size.Add(textSize, new Size(5, 5));
    }
}

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

这篇关于如何增加ToolTip矩形大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆