有没有办法将控件设置为工具提示?

时间:2013-04-11 14:31:33

标签: c# winforms controls tooltip

我想知道是否可以使用ToolTip.SetToolTip或类似的东西来打开控件作为工具提示而不仅仅是一个字符串(即SetToolTip(controlToWhichToAdd, panelToDisplayAsToolTip)而不是传递一个字符串作为你的第二个参数)。

如果这是不可能的,我猜测下一个最好的事情是在控件上的mouse_enter事件上的鼠标位置上显示一个面板,并在mouse_leave上将其删除(或使其不可见)。

还是有其他做法可以更容易地实现这一目标吗?

3 个答案:

答案 0 :(得分:1)

您可以为Tooltip.Popup event编写处理程序,并取消弹出窗口以显示您自己的面板。 不过,你需要在适当的时候清理它。

例如:

private void ToolTip1_Popup(Object sender, PopupEventArgs e)
{
  e.Cancel = true;
  //Do work here to display whatever control you'd like
}

如果您只是在工具提示显示中寻找更多格式化选项,则替代方法类似于this CodeProject entry,它实现了支持HTML的工具提示:

enter image description here

答案 1 :(得分:1)

这不是开箱即用的。你有两个选择。第一个选项是覆盖Draw Event,这将允许您自定义工具提示的外观。这是an example of this。如果您使用此方法,请务必将OwnerDraw属性设置为true

虽然第一种方法只需要一些简单的自定义就可以使用,但如果您需要更灵活的选项,第二种方法最有效。第二个选项是执行您已建议的操作并创建自己的工具提示。简而言之,您首先要为MouseEnter event创建一个事件处理程序。当该事件触发时,您将启用Timer。此计时器将是显示工具提示之前发生的延迟。最后,您只需将面板显示在鼠标坐标处。

假设您有一个带有按钮和计时器的表单,并且您希望按钮具有作为面板的工具提示:

public partial class Form1 : Form
{
    private Panel _myToolTipPanel;

    private void Form1_Load(object sender, EventArgs e)
    {
        _myToolTipPanel = new Panel {Visible = false};
        Controls.Add(_myToolTipPanel);

        Label myLabel = new Label();
        myLabel.Text = "Testing";
        _myToolTipPanel.Controls.Add(myLabel);
    }

    private void button1_MouseEnter(object sender, EventArgs e)
    {
        timer1.Enabled = true;
    }

    private void button1_MouseLeave(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        _myToolTipPanel.Visible = false;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Enabled = false;
        Point position = Cursor.Position;
        Point formPoisition = PointToClient(position);

        _myToolTipPanel.Visible = true;
        _myToolTipPanel.Location = formPoisition;
    }
}

当然,你必须对工具提示进行一些美化,但这是一般的想法!

答案 2 :(得分:1)

One Approach可以继承ToolTip控件,然后覆盖SetToolTip和Show 方法。在SetToolTip中,需要重写私有方法 - SetToolTipInternal ,但大部分功能可以重用 - 它使用鼠标事件(离开,移动)来绑定区域。但由于工具提示使用内部的窗口来显示气球窗口。你必须覆盖相当多的代码。

但这可能非常耗时,需要进行相当多的测试。