Last active
March 23, 2018 14:54
-
-
Save mjs3339/bbff4ac7194ee9e79c7396bd93c842f7 to your computer and use it in GitHub Desktop.
C# Custom ToolTip with Adjustable Font, Background Image, and Border
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class CustomToolTip : ToolTip | |
{ | |
private readonly float[] _GradientPositions; | |
private readonly ColorBlend gradientBlender; | |
private Color _gradientEndColor = Color.DeepSkyBlue; | |
private Color _gradientMiddleColor = Color.LightSkyBlue; | |
private Color _gradientStartColor = Color.LightSkyBlue; | |
public CustomToolTip() | |
{ | |
Font = new Font("Arial Narrow", 9.75F, FontStyle.Bold, GraphicsUnit.Point, 0); | |
_GradientPositions = new float[3]; | |
_GradientPositions[0] = 0f; | |
_GradientPositions[1] = .3f; | |
_GradientPositions[2] = 1f; | |
gradientBlender = new ColorBlend(3) {Positions = _GradientPositions}; | |
gradientBlender.Colors[0] = _gradientStartColor; | |
gradientBlender.Colors[1] = _gradientMiddleColor; | |
gradientBlender.Colors[2] = _gradientEndColor; | |
OwnerDraw = true; | |
Popup += OnPopup; | |
Draw += OnDraw; | |
} | |
/// <summary> | |
/// The font used in the drawing of the text. | |
/// </summary> | |
[Description("The font used in the drawing of the text.")] | |
public Font Font { get; set; } | |
/// <summary> | |
/// The background image used in the control. | |
/// </summary> | |
[Description("The background image used in the control.")] | |
public Image BackgroundImage { get; set; } | |
/// <summary> | |
/// Sets the color of the border | |
/// </summary> | |
[Description("Sets the color of the border")] | |
public Color BorderColor { get; set; } = Color.DodgerBlue; | |
/// <summary> | |
/// Enables or disables the drawing of the border | |
/// </summary> | |
[Description("Enables or disables the drawing of the border")] | |
public bool EnableBorder { get; set; } = true; | |
/// <summary> | |
/// Enables or disables the drawing of the Gradient Background | |
/// </summary> | |
[Description("Enables or disables the drawing of the Gradient Background")] | |
public bool EnableGradientBackground { get; set; } = false; | |
public string Text { get; set; } = ""; | |
/// <summary> | |
/// Sets the direction of the gradient | |
/// </summary> | |
[Description("Sets the direction of the gradient")] | |
public LinearGradientMode GradientMode { get; set; } = LinearGradientMode.Vertical; | |
/// <summary> | |
/// Sets the color of the start of the gradient | |
/// </summary> | |
[Description("Sets the color of the start of the gradient")] | |
public Color GradientStartColor | |
{ | |
get => _gradientStartColor; | |
set | |
{ | |
_gradientStartColor = value; | |
gradientBlender.Colors[0] = _gradientStartColor; | |
} | |
} | |
/// <summary> | |
/// Sets the color of the middle of the gradient | |
/// </summary> | |
[Description("Sets the color of the middle of the gradient")] | |
public Color GradientMiddleColor | |
{ | |
get => _gradientMiddleColor; | |
set | |
{ | |
_gradientMiddleColor = value; | |
gradientBlender.Colors[1] = _gradientMiddleColor; | |
} | |
} | |
/// <summary> | |
/// Sets the color of the end of the gradient | |
/// </summary> | |
[Description("Sets the color of the end of the gradient")] | |
public Color GradientEndColor | |
{ | |
get => _gradientEndColor; | |
set | |
{ | |
_gradientEndColor = value; | |
gradientBlender.Colors[2] = _gradientEndColor; | |
} | |
} | |
/// <summary> | |
/// Set or Get the lower,center,upper bounds for the gradient brush | |
/// </summary> | |
[Category("Behavior")] | |
[Description("Set or Get the lower,center,upper bounds for the gradient brush")] | |
public float[] GradientPositions | |
{ | |
get => _GradientPositions; | |
set | |
{ | |
_GradientPositions[0] = value[0]; | |
_GradientPositions[1] = value[1]; | |
_GradientPositions[2] = value[2]; | |
gradientBlender.Positions = _GradientPositions; | |
} | |
} | |
private void OnPopup(object sender, PopupEventArgs e) | |
{ | |
var tt = GetToolTip(e.AssociatedControl); | |
var newstr = tt.Replace(@"\n", Environment.NewLine); | |
e.ToolTipSize = newstr.MeasureText(Font, 1, 1); | |
} | |
private void OnDraw(object sender, DrawToolTipEventArgs e) | |
{ | |
var fs = Font.GetFontSize(); | |
var g = e.Graphics; | |
g.CompositingQuality = CompositingQuality.HighQuality; | |
g.InterpolationMode = InterpolationMode.High; | |
Text = e.ToolTipText; | |
var newstr = e.ToolTipText.Replace(@"\n", Environment.NewLine); | |
if (BackgroundImage == null) | |
if (EnableGradientBackground) | |
{ | |
var b = new LinearGradientBrush(e.Bounds, Color.Black, Color.Black, GradientMode) | |
{InterpolationColors = gradientBlender}; | |
g.FillRectangle(b, e.Bounds); | |
} | |
else | |
{ | |
g.FillRectangle(new SolidBrush(BackColor), new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); | |
} | |
else | |
g.DrawImage(new Bitmap(BackgroundImage, e.Bounds.Width, e.Bounds.Height), new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); | |
g.DrawString(newstr, Font, new SolidBrush(ForeColor), new PointF(e.Bounds.X + fs.Width / 2, e.Bounds.Y + fs.Height / 2)); | |
if (EnableBorder) | |
g.DrawRectangle(new Pen(new SolidBrush(BorderColor), 1), new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment