首页 > 解决方案 > 工具提示文本离开屏幕 (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));
        }

然后设置 ToolTip 文本:

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

此外,这是正在发生的事情的图像。

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

标签: c#.netwinformstooltip

解决方案


如果我正确理解您的问题,您正在尝试将此处此处发布的两种解决方案结合起来,主要是根据屏幕宽度调整ToolTip窗口大小,并将其移动到Point(2, 2)屏幕坐标。

如果这是您需要的,则需要稍微修改源代码以e.ToolTipSizePopup事件中设置权限,并如上面先生评论的那样,将字符串绘制在一个矩形中,即事件e.Bounds中的属性。Draw

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

}

SOQ65526197


推荐阅读