Как я могу нарисовать стрелки на левом закрепленном MenuStrip? - PullRequest
0 голосов
/ 07 октября 2008

У меня есть форма C #, в которую я поместил левосторонний MenuStrip. MenuStrip содержит некоторые пункты меню, которые содержат подменю, и некоторые пункты меню, которые фактически являются кнопками (нажатие на них приводит к действию; нет, я понимаю, что это не очень хороший дизайн).

Я бы хотел, чтобы пункты меню, с которыми были связаны меню, рисовали стрелку, указывающую вправо на пункте меню, так же, как это делает контекстное меню. Я вложил в подкласс ToolStripProfessionalRenderer и могу вызвать OnRenderArrow() в соответствующее время (например, в пределах OnRenderItemText() или аналогичное), но у меня нет способа определить правильное местоположение стрелки.

Итак, два взаимосвязанных вопроса здесь:

  1. Есть ли способ заставить стрелки быть нарисованными в пунктах меню верхнего уровня?
  2. Если нет, есть ли способ определить правильное расположение стрелки в пункте меню, чтобы OnRenderArrow() можно было вызывать вручную?

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 октября 2008

Почему бы вам не использовать System.Windows.Forms.ToolStrip вместо MenuStrip. Это позволит вам встроить функцию стрелки и даже решить проблему с плохим дизайном.

Если вы хотите, вы можете указать, что элементы панели инструментов не показывают изображения, а показывают только текст. Таким образом, вы можете почти точно имитировать функциональность Menustrip, но получить «стрелки вниз» бесплатно.

0 голосов
/ 07 октября 2008

Мне удалось взломать это вместе как решение, но я все еще хотел бы что-то менее тупое:

protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
    base.OnRenderItemText(e);
    if (e.Item.GetType() == typeof(ToolStripMenuItem))
    {
        ToolStripMenuItem tsmi = (ToolStripMenuItem)e.Item;
        if (tsmi.HasDropDownItems && tsmi.OwnerItem == null)
        {
            Rectangle bounds = tsmi.Bounds;
            bounds.X = bounds.Right - 25;
            bounds.Width = 25;
            bounds.Y = 0;
            ToolStripArrowRenderEventArgs tsarea = new ToolStripArrowRenderEventArgs(
                e.Graphics,
                e.Item,
                bounds,
                e.TextColor,
                ArrowDirection.Right);
            OnRenderArrow(tsarea);
        }
    }
}
...