工具提示文本离开屏幕 (WinForms)

Tooltip Text going off screen (WinForms)

我画了一个工具提示控件 - 代码如下。

private void toolTip1_Popup(object sender, PopupEventArgs e)
        {
            ToolTip tt = (sender as ToolTip);
            string toolTipText = tt.GetToolTip(e.AssociatedControl);
            e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Arial", 16.0f));
        }
private void toolTip1_Draw(object sender, DrawToolTipEventArgs e) => DrawToolTip(sender, e);

        [System.Runtime.InteropServices.DllImport("User32.dll")]
        static extern bool MoveWindow(IntPtr h, int x, int y, int width, int height, bool redraw);
        private void DrawToolTip(object sender, DrawToolTipEventArgs e)
        {
            ToolTip tt = (sender as ToolTip);
            string toolTipText = tt.GetToolTip(e.AssociatedControl);
            Font f = new Font("Arial", 16.0f);
            e.DrawBackground();
            e.DrawBorder();
            toolTipText = e.ToolTipText;
            e.Graphics.DrawString(e.ToolTipText, f, Brushes.Black, new PointF(2, 2));
        }

然后设置工具提示文本:

toolTip1.SetToolTip(btnLogin, "Some text....."); 

此外,here is an image of what is happening.

看起来不错,但我注意到,如果文本超过一定长度,工具提示将离开屏幕。有什么办法可以防止这种情况发生吗?我宁愿不必添加 Environment.NewLine();或 \n 等,因为我需要对许多字符串执行此操作。

如果我对你的问题的理解正确,你正在尝试结合发布 and 的两个解决方案,主要是根据屏幕宽度调整ToolTipwindow的大小,并将其移动到Point(2, 2), 屏幕坐标.

如果这就是你所需要的,你需要修改源代码一点,在Popup事件中设置正确的e.ToolTipSize,并且像上面的先生们评论的那样,将字符串绘制在矩形,Draw 事件中的 e.Bounds 属性。

using System;
using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public partial class Form1 : Form
{
    TextFormatFlags flags = TextFormatFlags.VerticalCenter
    | TextFormatFlags.Left
    | TextFormatFlags.LeftAndRightPadding
    | TextFormatFlags.NoClipping
    | TextFormatFlags.WordBreak;

    public Form1()
    {
        InitializeComponent();
    }

    private void toolTip1_Popup(object sender, PopupEventArgs e)
    {
        var tt = sender as ToolTip;
        var toolTipText = tt.GetToolTip(e.AssociatedControl);
        var screen = Screen.FromControl(e.AssociatedControl).WorkingArea;

        using (var g = e.AssociatedControl.CreateGraphics())
        using (var font = new Font("Arial", 16))
        {
            var sz = TextRenderer.MeasureText(
                g, toolTipText, font, screen.Size, flags);

            e.ToolTipSize = new Size(screen.Width - 2, sz.Height + 10);
        }
    }

    private void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
    {
        var t = sender as ToolTip;
        var h = (IntPtr)t.GetType().GetProperty("Handle",
            BindingFlags.NonPublic | BindingFlags.Instance).GetValue(t);

        MoveWindow(h, 2, 2, e.Bounds.Width - 2, e.Bounds.Height, false);

        e.DrawBackground();
        e.DrawBorder();

        using (var font = new Font("Arial", 16))
            TextRenderer.DrawText(e.Graphics, e.ToolTipText, font, 
                e.Bounds, Color.Black, flags);
    }

    [DllImport("User32.dll")]
    static extern bool MoveWindow(IntPtr h, int x, int y, 
        int width, int height, bool redraw);

}