How to align right edges of a control and ToolTip Message in C#

Question

I want to display a ToolTip message below a textbox, but also want them to be right aligned.

I was able to position the ToolTip message at the right edge of the textbox, so I tried to move the message left by message length.

So I tried to get the string length by using TextRenderer.MeasureText(), but the position is a little bit off as shown below.

current result

private void button1_Click(object sender, EventArgs e)
{
   ToolTip myToolTip = new ToolTip();

   string test = "This is a test string.";
   int textWidth = TextRenderer.MeasureText(test, SystemFonts.DefaultFont, textBox1.Size, TextFormatFlags.LeftAndRightPadding).Width;
   int toolTipTextPosition_X = textBox1.Size.Width - textWidth;

   myToolTip.Show(test, textBox1, toolTipTextPosition_X, textBox1.Size.Height);
}

I tried with different flags in the MeasureText() function but it didn't help, and since ToolTip message has a padding, I went for TextFormatFlags.LeftAndRightPadding.

To be clear, this is what I would like to achieve:

desired output


Show source
| c#   | winforms   | tooltip   | alignment   2016-12-24 16:12 2 Answers

Answers to How to align right edges of a control and ToolTip Message in C# ( 2 )

  1. 2016-12-24 17:12

    You can set OwnerDraw property of the ToolTip to true. Then you can control appearance of the tooltip in Draw event this way:

    [System.Runtime.InteropServices.DllImport("User32.dll")]
    static extern bool MoveWindow(IntPtr h, int x, int y, int width, int height, bool redraw);
    private void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
    {
        e.DrawBackground();
        e.DrawBorder();
        e.DrawText();
        var t = (ToolTip)sender;
        var h = t.GetType().GetProperty("Handle",
          System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var handle = (IntPtr)h.GetValue(t);
        var c = e.AssociatedControl;
        var location = c.Parent.PointToScreen(new Point(c.Right - e.Bounds.Width, c.Bottom));
        MoveWindow(handle, location.X, location.Y, e.Bounds.Width, e.Bounds.Height, false);
    }
    

    enter image description here

  2. 2016-12-24 18:12

    The ToolTip font is bigger than SystemFonts.DefaultFont so the measurement is incorrect. I don't know what is the exact variable for the ToolTip font, but many of the other SystemFonts are configured to Segoe UI/size 9, which the Tooltip font in my PC. In addition, you have to add 6px for the padding.

    private void button1_Click(object sender, EventArgs e)
    {
        ToolTip myToolTip = new ToolTip();
    
        string test = "This is a test string.";
        int textWidth = TextRenderer.MeasureText(test, SystemFonts.CaptionFont, textBox1.Size, TextFormatFlags.LeftAndRightPadding).Width;
        textWidth += 6;
        int toolTipTextPosition_X = textBox1.Size.Width - textWidth;
    
        myToolTip.Show(test, textBox1, toolTipTextPosition_X, textBox1.Size.Height);
    }
    

    For perfect control you could draw the tooltip yourself with Tooltip.OwnerDraw and the event Tooltip.Draw, choosing font, padding and appearance.

Leave a reply to - How to align right edges of a control and ToolTip Message in C#

◀ Go back