8

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

那么,甚至可以更改 ToolStripMenuItem 的工具提示字体吗?

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

4

3 回答 3

14

好的,感谢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");
    
于 2011-01-12T13:33:36.610 回答
3

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

在此处查看示例(有一个 vb 和 c# 示例)。

编辑

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

于 2011-01-11T12:09:00.753 回答
1

我知道我参加这个聚会有点晚了,但是您可以使用反射来设置用于呈现工具提示的 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});
}
于 2017-09-10T09:05:03.740 回答