【问题标题】:Is it possible to change ToolStripMenuItem tooltip font?是否可以更改 ToolStripMenuItem 工具提示字体?
【发布时间】:2011-06-07 03:25:17
【问题描述】:

我有一个动态填充的 ContextMenuStrip,其中每个 ToolStripMenuItem 都有一个用于工具提示的格式化文本。而且,为了让这个文本对用户有意义,我必须使用等宽字体,例如“Courier New”。默认字体是常规的非等宽字体。 我找不到 ToolTip 对象的任何 getter,也找不到覆盖其 Draw 事件的方法,也找不到设置其样式的方法。

那么,是否可以更改 ToolStripMenuItem 的工具提示字体?

实现继承自 ToolTip 的 CustomToolTip 并不能解决问题,即将新的工具提示传递给 ToolStripMenuItem。

【问题讨论】:

  • 我怀疑您可能需要使用许多第三方工具提示组件之一,例如telerik.com
  • 很遗憾,我无法使用任何第三方组件。
  • 这里有些东西没有意义。您已标记问题 WPF,但您正在谈论 ToolStripMenuItem 控件。那是一个 WinForms 控件。你用的是哪个?我怀疑它有很大的不同。
  • 你是对的。我的错。我删除了 WPF 标签

标签: c# .net winforms tooltip toolstrip


【解决方案1】:

好的,感谢Tony AbramsWilliam Andrus,解决方法如下:

  • 已初始化的 ToolTip 静态实例。

    toolTip = new ToolTip();
    toolTip.OwnerDraw = true;
    toolTip.Draw += new DrawToolTipEventHandler(tooltip_Draw);
    toolTip.Popup += new PopupEventHandler(tooltip_Popup);    
    toolTip.UseAnimation = true;
    toolTip.AutoPopDelay = 500;
    toolTip.AutomaticDelay = 500;
    
  • ToolTip 的 Popup 事件来设置它的大小。

    void tooltip_Popup(object sender, PopupEventArgs e)
    {
        e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Courier New", 10.0f, FontStyle.Bold));
        e.ToolTipSize = new Size(e.ToolTipSize.Width + TOOLTIP_XOFFSET, e.ToolTipSize.Height + TOOLTIP_YOFFSET);
    }
    
  • ToolTip 的 Draw 事件,用于实际绘图。

    void tooltip_Draw(object sender, DrawToolTipEventArgs e)
    {
    Rectangle bounds = e.Bounds;
    bounds.Offset(TOOLTIP_XOFFSET, TOOLTIP_YOFFSET);
    DrawToolTipEventArgs newArgs = new DrawToolTipEventArgs(e.Graphics, e.AssociatedWindow, e.AssociatedControl, bounds, e.ToolTipText, toolTip.BackColor, toolTip.ForeColor, new Font("Courier New", 10.0f, FontStyle.Bold));
        newArgs.DrawBackground();
        newArgs.DrawBorder();
        newArgs.DrawText(TextFormatFlags.TextBoxControl);
    }
    
  • ToolStripMenuItem 的 MouseEnter 事件以显示工具提示。

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem);
    toolTip.SetToolTip(item.Owner, "ToolTipText");
    

【讨论】:

  • +1 感谢您发布最终解决方案!这样,如果其他人带着同样的问题来到这里,他们就会知道你是如何解决的。我还为您格式化了代码。让格式在项目符号中起作用的技巧是缩进 8 个空格,而不是正常的 4 个。
  • 我正在寻找一个稍微相关的问题的解决方案:在工具条的某些按钮上显示带有自定义文本的工具提示,但不是在所有按钮上。不需要自定义绘图,但禁用工具条的内置工具提示,并处理 ToolStripMenuItem 的 MouseEnter 和 MouseLeave 以显示项目的工具提示文本,如果它不是 null 或空的话,效果很好。
  • 对我来说效果很好,尽管在某些情况下我最终得到了一个额外的(空白)工具提示,这似乎是当我的窗口重新绘制使用工具提示的按钮控件时)。为了解决这个问题,我确保我的 MouseLeave 处理了工具提示并在 MouseHover 中重新创建了工具提示。显然需要两个听众之外的参考才能起作用。
  • 干得好。赞成。在实践中,使用默认设置,有时无法正确绘制边框,我认为这只是 Windows 的另一个礼物 :) 在 .NET 4.5 中,我发现有必要强制工具提示隐藏在悬停事件处理程序中,如果它是'主动:if(customToolTip.Active) customToolTip.Hide(); ...为了让工具提示根据需要消失。
  • 正如 ElyaSh 所说,Tony Abrams 的回答和 William Andrus 的解决方案是创建自定义工具提示的好解决方案。
【解决方案2】:

您可以创建一个继承自 ToolTip 的自定义 ToolTip 类 (CustomToolTip)。然后你必须处理 OnDraw 事件。在该事件中,您可以更改字体。

Look here 举个例子(有一个 vb 和 c# 的例子)。

编辑

您必须自己处理自定义工具提示的呈现(即:工具条菜单的 OnMouseOver、OnMouseLeave 事件)。您也许可以创建一个使用自定义工具提示的 customtoolstripmenuitem,但我不确定 toolstripmenuitem 是否公开了工具提示属性/对象。

【讨论】:

  • 问题不在于从 ToolTip 继承,而在于将其提供给 ToolStripMenuItem。
  • 您必须自己处理自定义工具提示的呈现(即:工具条菜单项的 OnMouseOver、OnMouseLeave 事件)。您也许可以创建一个使用自定义工具提示的 customtoolstripmenuitem,但我不确定 toolstripmenuitem 是否公开了工具提示属性/对象。
  • toolstripmenuitem 不公开工具提示属性/对象是我决定在这里提出问题的主要原因。
  • 这就是为什么我提供了创建自定义工具提示(您可以在其中更改字体设置)的答案,然后是关于您必须处理自定义工具提示的呈现的更新。此外,仅仅因为默认控件不公开属性并不意味着它不包含私有/内部(也称为未公开)属性。
  • 对不起,我误解了你之前的评论。现在它确实给了我一个新的方向,据此我找到了以下andrusdevelopment.blogspot.com/2007/10/…。希望它能回答我的问题。
【解决方案3】:

我知道我参加这个聚会有点晚了,但是您可以使用反射来设置用于呈现工具提示的 ToolTip 实例。完成后,您可以像往常一样使用 Draw 方法。

public void SetToolTipInstance(ToolStrip ts, ToolTip tt)
{
    Type type = ts.GetType.BaseType;
    int propToolTip = Convert.ToInt32(type.GetField("PropToolTip", BindingFlags.NonPublic | BindingFlags.Static).GetValue(ts));
    dynamic ps = type.BaseType.GetProperty("Properties", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ts);
    ps.GetType.GetMethod("SetObject", BindingFlags.Instance | BindingFlags.Public).Invoke(ps, {propToolTip,tt});
}

【讨论】:

  • 它可以工作,但是如何设置它的DropDownItems
猜你喜欢
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多