如何在左侧停靠的MenuStrip上绘制箭头?

时间:2008-10-07 15:07:54

标签: c# .net winforms menustrip

我有一个C#表单,我放置了一个左对接的MenuStrip。这个MenuStrip包含一些包含子菜单的菜单项,以及一些有效按钮的菜单项(点击它们会导致动作发生; n.b.,我意识到这不是一个好的设计)。

我希望菜单项具有与之关联的菜单,在菜单项上绘制向右箭头,与上下文菜单相同。我已经将ToolStripProfessionalRenderer子类化,并且可以在适当的时间调用OnRenderArrow()(例如,在OnRenderItemText()或类似内),但我似乎没有办法确定正确的位置箭头。

所以,这里有两个相互关联的问题:

  1. 有没有办法强制在顶级菜单项上绘制箭头?
  2. 如果没有,有没有办法确定菜单项上箭头的正确位置,以便可以手动调用OnRenderArrow()
  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

为什么不考虑使用System.Windows.Forms.ToolStrip而不是MenuStrip。这将允许您内置箭头功能,甚至可以解决您遇到的不良设计问题。

您是否希望可以指定工具条项目不显示图像而仅显示文本。通过这种方式,您几乎可以完全模仿menustrip的功能,但可以免费获得“下拉箭头”。

答案 1 :(得分:0)

我能够一起解决这个问题,但我仍然喜欢不那么迟钝的东西:

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