Ну, поскольку при смешивании TextRenderer
и объекта Graphics
могут быть некоторые причуды, вот пример:
The *Событие 1010 * ToolTip.PopUp предоставляет средства для установки размера прямоугольника всплывающей подсказки.Вам просто нужно измерить текст и установить его PopupEventArgs.ToolTipSize на измеренный размер.
Это также позволяет использовать многострочные строки, используя Environment.NewLine дляразделите линии.
Объект PopupEventArgs
не предоставляет объект Graphics
, который можно использовать для измерения текста.Вместо этого мы можем использовать TextRenderer.MeasureText .
TextRenderer.MeasureText
очень точный: он вернет точную меру текста.Поскольку вы используете Graphics.DrawString
для рисования текста, нам лучше быть щедрым и добавить больше места к измеренной ширине, чтобы избежать переноса текста, а также потому, что текст выглядит лучше, если прямоугольник контейнера не слишкомтуго.
В событии Popup после измерения текста я добавляю 10 пикселей к ширине.При необходимости измените
Примечание :
Здесь семейство Font и размер жестко закодированы.Конечно, вы можете использовать более динамический объект Font, возможно связанный со свойством UserControl
.Шрифт может быть изменен в любое время: событие PopUp
будет использовать его для измерения границ теста.

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