一个控件上有多个带下划线的工具提示 - WinForms

时间:2011-02-10 01:32:37

标签: c# winforms tooltip

我想要一个显示的控件。

工具提示1 notooltip 工具提示2

   ^             ^
TOOLTIPA      TOOLTIPB

当悬停在tooltip1上时显示一个工具提示,而当超过tooltip2时显示另一个工具提示。实际上,这些都有下划线和蓝色。

我可以使用richtextbox完成此操作,并通过GetPositionFromCharIndex和鼠标事件跟踪工具提示的位置。但是,使用richtextbox我无法在不禁用控件的情况下禁用文本选择/位置插入符号,这反过来会禁用我的所有事件。

我不想使用多个标签,因为它需要手动间隔标签,因为处理字符间距。

是否有像Dev Express这样的第三方控件可以处理这个问题?任何替代方案?

由于

2 个答案:

答案 0 :(得分:1)

我不是100%肯定你在描述中要求的是什么,但似乎你想要一个带有工具提示的控件谁的标题取决于鼠标悬停在控件的哪个部分?

我想不出一个“好”的方法来做到这一点。下面的代码适用于Label,但它很难看。我个人宁愿创建一个包含多个标签的UserControl,并担心手动间隔它们。但这就是我得到的:

        Label lbl = new Label() { Left = 6, Top = 6, AutoSize = true };
        this.Controls.Add(lbl);

        // Determine the width of each of the "sections" of the Label Text.
        // Use the fact that AutoSize = true will increase the Width of the
        //  Label as you increase the Text Length.
        int width = lbl.Width;
        lbl.Width = 0;
        lbl.Text = string.Empty;
        lbl.Text = "x";
        int delta = lbl.Width;
        lbl.Text += "x";
        delta = lbl.Width - 2 * (lbl.Width - delta);
        lbl.Text = "ToolTip1";
        int txt1Width = lbl.Width - delta;
        delta = lbl.Width;
        lbl.Text += " NoToolTip ";
        int txt2Width = lbl.Width - delta;
        delta = lbl.Width;
        lbl.Text += "ToolTip2";
        int txt3Width = lbl.Width - delta;

        // Use a System.Windows.Forms.ToolTip and set the caption on 
        //  MouseHover, depending on the Position of the Cursor.
        var tip = new ToolTip();
        lbl.MouseHover += delegate(object sender, EventArgs e)
        {
            tip.RemoveAll();

            // Find the Point for the ToolTip (relative to the Label) based
            //  on the Position of the Cursor.
            this.Cursor = new Cursor(Cursor.Current.Handle);
            Point lblScreenPos = lbl.PointToScreen(Point.Empty);
            Point tipPoint = new Point(Cursor.Position.X, Cursor.Position.Y + lbl.Height);
            tipPoint = new Point(tipPoint.X - lblScreenPos.X, tipPoint.Y - lblScreenPos.Y);

            // Determine the location of the "sections" of Label text.
            int x = tipPoint.X;
            int txt1Left = 3;
            int txt1Right = txt1Left + txt1Width;
            int txt3Left = txt1Right + txt2Width;
            int txt3Right = txt3Left + txt3Width;

            // Show the ToolTip with the correct caption.
            if (x >= txt1Left && x <= txt1Right)
            {
                tip.Show("TOOLTIPA", lbl, tipPoint, tip.AutoPopDelay);
            }
            else if (x >= txt3Left && x <= txt3Right)
            {
                tip.Show("TOOLTIPB", lbl, tipPoint, tip.AutoPopDelay);
            }
        };
        lbl.MouseLeave += delegate(object sender, EventArgs e) { tip.RemoveAll(); };

工具提示没有下划线,系统默认字体会自动使用。这只能由所有者绘制工具提示来覆盖。如果您需要将其设为蓝色并加下划线,请查看OwnerDraw属性。

答案 1 :(得分:0)

这就是你所追求的:

ToolTip toolTip = new ToolTip();
toolTip.SetToolTip(control1, "Hello ");
toolTip.SetToolTip(control2, "world!");

......还是我完全错过了这艘船?从您的描述中了解问题是有点困难。