Я знаю, что немного опоздал на вечеринку по этому поводу, но вы можете использовать отражение, чтобы установить экземпляр всплывающей подсказки, который используется для отрисовки подсказок. После этого вы можете просто использовать метод Draw, как обычно.

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

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

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

 ElyaSh11 янв. 2011 г., 13:18
вы правы. Виноват. Я удалил тэг WPF
 Cody Gray♦11 янв. 2011 г., 13:17
Что-то здесь не имеет смысла. Вы пометили вопрос WPF, но вы говорите оToolStripMenuItem контроль. Это элемент управления WinForms. Что вы используете? Я подозреваю, что это имеет огромное значение.
 Lazarus11 янв. 2011 г., 13:10
Я подозреваю, что вам может понадобиться использовать один из множества сторонних компонентов всплывающей подсказки, таких какtelerik.com
 ElyaSh11 янв. 2011 г., 13:14
К сожалению, я не могу использовать какой-либо сторонний компонент.

Ответы на вопрос(3)

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

Тони Абрамс а такжеУильям Андрус, решение заключается в следующем:

Статический экземпляр 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;

Всплывающее событие всплывающей подсказки, чтобы установить его размер.

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);
}

Подсказка 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);
}

Событие MouseEnter ToolStripMenuItem для отображения всплывающей подсказки.

System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem);
toolTip.SetToolTip(item.Owner, "ToolTipText");
 Devology Ltd08 янв. 2014 г., 12:44
Работал отлично для меня, хотя в некоторых ситуациях я получал дополнительную (пустую) всплывающую подсказку, это происходило, когда мое окно перерисовывало элементы управления кнопки, которые использовали всплывающие подсказки). Для решения этой проблемы я обеспечил, чтобы мой MouseLeave располагал всплывающую подсказку и заново создал всплывающую подсказку в MouseHover. Очевидно, что для того, чтобы это работало, нужна ссылка за пределами обоих слушателей.
 Mohsen11 окт. 2017 г., 20:37
Как сказал ElyaSh, ответ Тони Абрамса и решение Уильяма Андруса являются хорошим решением для создания настраиваемой подсказки.
 BillW28 июн. 2014 г., 12:23
Хорошо сделано. Upvoted. На практике, с настройками по умолчанию, иногда граница рисуется неправильно, что я предполагаю, что это просто еще один подарок от Windows :). В .NET 4.5 я обнаружил, что необходимо заставить ToolTip скрываться в обработчике событий Hover, если он был ' Активно: if (customToolTip.Active) customToolTip.Hide (); ... чтобы подсказка исчезла по желанию.
 neminem29 июн. 2012 г., 17:33
Я искал решение для слегка связанной проблемы: показ всплывающей подсказки с пользовательским текстом на некоторых кнопках панели инструментов, но не на всех. Не требовался пользовательский рисунок, но отключение встроенных всплывающих подсказок панели инструментов и обработка MouseEnter и MouseLeave в ToolStripMenuItem для отображения текста подсказки элемента, если он не был пустым или пустым, работали отлично.
 Cody Gray♦12 янв. 2011 г., 14:54
+1 Спасибо за публикацию окончательного решения! Таким образом, если кто-то еще придет сюда с тем же вопросом, он узнает, как вы его решили. Я также отформатировал код для вас. Хитрость в том, чтобы заставить работать форматирование в пределах маркеров, состоит в том, чтобы сделать отступ в 8 пробелов, а не в 4.

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

Смотри сюда для примера (есть пример vb и c #).

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

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

 Tony Abrams11 янв. 2011 г., 13:43
И именно поэтому я предоставил свой ответ о создании настраиваемой подсказки (где вы можете изменить настройки шрифта), а затем обновил информацию о том, что вам нужно обрабатывать отображение настраиваемой подсказки. Кроме того, только потому, что элемент управления по умолчанию не предоставляет свойство, которое не означает, что оно не содержит приватное / внутреннее (или не раскрывается) свойство.
 ElyaSh11 янв. 2011 г., 14:02
Извините, я неправильно понял ваш предыдущий комментарий. Теперь это фактически дало мне новое направление, согласно которому я нашел следующееandrusdevelopment.blogspot.com/2007/10/... , Надеюсь, это ответит на мой вопрос.
 ElyaSh11 янв. 2011 г., 13:15
Проблема не в наследовании от ToolTip, а в предоставлении его ToolStripMenuItem.
 Tony Abrams11 янв. 2011 г., 13:32
Вам придется самостоятельно обрабатывать отображение пользовательской всплывающей подсказки (события IE: OnMouseOver, OnMouseLeave для toolstripmenuitem). Возможно, вам удастся создать customtoolstripmenuitem, который использует настраиваемую подсказку, но я не уверен, что toolstripmenuitem предоставляет объект / подсказку.
 ElyaSh11 янв. 2011 г., 13:38
Toolstripmenuitem не раскрывая свойства / объект подсказки, является основной причиной, по которой я решил задать вопрос здесь.

Ваш ответ на вопрос