Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 216
vitruvius Avatar asked Dec 24 '16 15:12

vitruvius


2 Answers

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.

like image 45
rm5432 Avatar answered Sep 29 '22 06:09

rm5432


You can set OwnerDraw property of the ToolTip to true. Then you can control appearance and location of the tooltip in Draw event. In the following example, I've found the tooltip handle and moved it to the desired location using MoveWindow Windows API function :

[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

like image 88
Reza Aghaei Avatar answered Sep 29 '22 06:09

Reza Aghaei