Как я могу рисовать стрелки на моем MenuStrip, закрепленном слева?

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

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

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

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

Спасибо!


person Stephen Deken    schedule 07.10.2008    source источник


Ответы (2)


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

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

person FryHard    schedule 07.10.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);
        }
    }
}
person Stephen Deken    schedule 07.10.2008