如何增加ToolTip矩形大小 [英] 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.
推荐答案
好吧,因为混合 TextRenderer
和 Graphics
对象时可能会有一些怪癖,这是一个示例:
Well, since there might be some quirks when mixing TextRenderer
and the Graphics
object, here's an example:
PopupEventArgs.ToolTipSize 属性设置为所测量的大小.
这也允许使用环境. 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屋!