Можно ли изменить шрифт всплывающей подсказки ToolStripMenuItem? - PullRequest
6 голосов
/ 11 января 2011

У меня есть динамически заполненная ContextMenuStrip, где каждый ToolStripMenuItem имеет форматированный текст для всплывающей подсказки. И, чтобы этот текст имел смысл для пользователя, я должен использовать моноширинный шрифт, такой как «Courier New». Шрифт по умолчанию - обычный, не моноширинный шрифт. Я не смог найти ни метода получения объекта ToolTip, ни способа переопределения его события Draw, ни способа установить его стиль.

Итак, возможно ли изменить шрифт всплывающей подсказки ToolStripMenuItem?

Реализация CustomToolTip, которая наследуется от ToolTip, не решает проблему, которая передает новую всплывающую подсказку в ToolStripMenuItem.

Ответы [ 3 ]

12 голосов
/ 12 января 2011

ОК, благодаря Тони Абрамсу и Уильяму Андрусу , решение выглядит следующим образом:

  • Статический экземпляр 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 для установки его размера.

    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 для фактического рисунка.

    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");
    
3 голосов
/ 11 января 2011

Вы можете создать собственный класс ToolTip (CustomToolTip), который наследуется от ToolTip.Тогда вам придется обрабатывать событие OnDraw.Внутри этого события вы можете изменить шрифт.

Посмотрите здесь пример (есть пример vb и c #).

РЕДАКТИРОВАТЬ

Вы должны были бысамостоятельно обрабатывать отображение пользовательской всплывающей подсказки (события IE: OnMouseOver, OnMouseLeave для toolstripmenuitem).Возможно, вам удастся создать customtoolstripmenuitem, который использует настраиваемую подсказку, но я не уверен, что toolstripmenuitem предоставляет объект / подсказку.

0 голосов
/ 10 сентября 2017

Я знаю, что немного опоздал на вечеринку по этому поводу, но вы можете использовать отражение, чтобы установить экземпляр всплывающей подсказки, который используется для отрисовки подсказок. После этого вы можете просто использовать метод 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});
}
...